Guest User

icurr

a guest
Sep 29th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.26 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "os"
  7.     "strconv"
  8. )
  9.  
  10. var (
  11.     db      = []string{"1", "3", "5", "7", "99"}
  12.     length  = len(db)
  13.     actions = make(map[int]bool)
  14. )
  15.  
  16. func main() {
  17.     f, _ := os.Open("result")                      // читаем файл со свежей выборкой данных
  18.     defer f.Close()                                // закрываем файл на выходе из функции
  19.     scanner := bufio.NewScanner(f)                 // открываем сканнер файла
  20.     var iCurrDBElem, iCurrFileElem, iDBElemPos int // инициализируем переменные: iCurrDBElem - элемент из текущей базы данных, iCurrFileElem - элемент из файла, iDBElemPos - позиция текущего элемента в БД
  21.     var isA, isR = true, true                      // индикатор проверки элемента: если true, значит данный элемент уже сравнивали, можно брать следующий
  22.     var endOfA, endOfR bool                        // индикатор конца массива с данными из БД/файла
  23.     for {
  24.         if iDBElemPos == length { // если iDBElemPos равно длине массива
  25.             endOfA = true // то больше не пытаемся считать новый элемент из массива, чтобы не выйти за диапазон
  26.         }
  27.         if isA { // если выполняется условие проверки предыдущего элемента, то берем из массива новый
  28.             for ; iDBElemPos < length; iDBElemPos++ {
  29.                 if iNextDBElem, err := strconv.Atoi(db[iDBElemPos]); err != nil || iNextDBElem == iCurrDBElem { // конвертируем строковое значение из массива в числовое
  30.                     continue // если ошибка конвертации, или новое значение (iNextDBElem) совпадает с текущим (А), то берем следующее
  31.                 } else { // в противном случае переназначаем текущее значение элемента из БД, увеличиваем счетчик
  32.                     iCurrDBElem, iDBElemPos, isA = iNextDBElem, iDBElemPos+1, false // индиактор равен false, пока мы не решим, что делать с текущим элементом
  33.                     break                                                           // выходим из цикла
  34.                 }
  35.             }
  36.         }
  37.         if isR { // аналогичные действия с элементами из файла
  38.             endOfFile := true    // Scan() возвращает булево значение, можно ли считать данные из файла, поэтому сначала предполагаем, что файл закончился
  39.             for scanner.Scan() { // если можем считать новые данные
  40.                 if iNextFileElem, err := strconv.Atoi(scanner.Text()); err != nil || iNextFileElem == iCurrFileElem { // при этом нет ошибок и новый элемент не равен предыдущему
  41.                     continue
  42.                 } else { // то перезаписываем текущий элемент, обнуляем индикаторы конца файла и условия проверки текущего
  43.                     iCurrFileElem, endOfFile, isR = iNextFileElem, false, false
  44.                     break
  45.                 }
  46.             }
  47.             if endOfFile { // если мы не переназначили данную переменную, то значит файл действительно кончился
  48.                 endOfR = true // (работать со сканером пиздец как неудобно)
  49.             }
  50.         }
  51.         if endOfA || endOfR { // для начала проверяем, не закончился ли массив или файл, это нужно, чтобы не реинициализировать индикаторы проверки текущих элементов, и не полезть за новыми данными
  52.             if iCurrDBElem < iCurrFileElem { // если элемент из БД меньше элемента из файла
  53.                 if !isA { // и мы еще не сравнивали этот элемент
  54.                     actions[iCurrDBElem] = false // то помечаем элемент из БД на удаление
  55.                 }
  56.                 if !isR { // если же элемент из файла еще ни разу не был проверен
  57.                     actions[iCurrFileElem], isR = true, true // то помечаем его на добавление, ставим индикатор, что можно взять из файла новый элемент
  58.                 }
  59.             } else if iCurrDBElem > iCurrFileElem {
  60.                 if !isR {
  61.                     actions[iCurrFileElem] = true
  62.                 }
  63.                 if !isA {
  64.                     actions[iCurrDBElem], isA = false, true
  65.                 }
  66.             } else {
  67.                 if endOfA && !isA || endOfR && !isR {
  68.                     isA, isR = true, true
  69.                 }
  70.             }
  71.         }
  72.         if !endOfA && !endOfR {
  73.             if iCurrDBElem < iCurrFileElem {
  74.                 actions[iCurrDBElem], isR, isA = false, false, true
  75.             } else if iCurrDBElem > iCurrFileElem {
  76.                 actions[iCurrFileElem], isA, isR = true, false, true
  77.             } else {
  78.                 isA, isR = true, true
  79.             }
  80.         }
  81.         if endOfA && endOfR {
  82.             break
  83.         }
  84.     }
  85.     fmt.Println(actions)
  86. }
Advertisement
Add Comment
Please, Sign In to add comment