2015-07-27 6 views
-2

Я ищу фрагмент кода, который делает следующее:Diff между двумя файлами

Учитывая два списка строки, представляющей два файла

Например,

  • FILE1 = {» SSome», "SSimple", "TText", "FFile"}
  • ФАЙЛ2 = { "AAnother", "TText", "FFile", "W с", "AAdditional", "LLines"}

Если я позвоню дифференциал (file1, file2)

Выход будет одним из различий между ФАЙЛА1 и ФАЙЛЕ2:

  1. * SSome | Еще
  2. -SSimple
  3. TText
  4. FFile
  5. + WWith
  6. + AAdditional
  7. + LLines

Большое спасибо!

+0

наклоняется, говорю ли я понимаю ваш д, но, возможно, вы wqnt большого «FILE» строки. для сравнения с каждой отдельной строкой в ​​менее крупных «ФАЙЛАХ» и распечатать diff? Маленькое прошивание, и вы смеетесь в функцию String.equals для сравнения двух строк. – RadijatoR

+0

Все остальное имеет смысл, но что логика для '* Some | Another' – Shahzeb

+0

Вы можете просто проанализировать файл, добавить строки для разделения наборов и взять разность наборов и других заданных операций, чтобы выяснить, что отличается. что ты уже испробовал? –

ответ

0

Я собираю из вашего вопроса следующее:

  • *word1|word2 - Имеется в виду слово из файла 1 был изменен в файле 2
  • -word - Имеется в виду слово из файла 1 был удален файл 2
  • word - Значит, слово из файла 1 оставалось неизменным в файле 2
  • +word - означает, что слово изначально не было в файле 1, но было добавлено в файл 2

Я понял, что файл 1 является «исходным» файлом, а файл 2 является «целевым» файлом, для которого мы показываем эти отличия.Сказав это, попробуйте этот алгоритм (Это не идеально подходит для DiffNow, но это довольно близко):

public static void main(String[] args) throws Exception { 
    List<String> file1 = new ArrayList(Arrays.asList("Some", "Simple", "Text", "File")); 
    List<String> file2 = new ArrayList(Arrays.asList("Another", "Text", "File", "With", "Additional", "Lines")); 

    boolean diff = false; 
    int file2Index = 0; 
    for (int file1Index = 0; file1Index < file1.size();) { 
     if (!file1.get(file1Index).equals(file2.get(file2Index)) && !diff) { 
      diff = true; 
      // The word from file 1 was changed 
      System.out.println("*" + file1.get(file1Index) + "|" + file2.get(file2Index)); 
      file1Index++; 
      file2Index++; 
     } else if (!file1.get(file1Index).equals(file2.get(file2Index)) && diff) { 
      // This word was removed from file 1 
      System.out.println("-" + file1.get(file1Index)); 
      file1Index++; 
     } else { 
      System.out.println(file1.get(file1Index)); 
      diff = false; 
      file1Index++; 
      file2Index++; 
     } 
    } 

    // Print what's left from file 2 
    for (; file2Index < file2.size(); file2Index++) { 
     System.out.println("+" + file2.get(file2Index)); 
    } 
} 

Результатов:

*Some|Another 
-Simple 
Text 
File 
+With 
+Additional 
+Lines 
+0

* word1 | word2 - означает, что первое слово первого файла было изменено на слово 2 второго файла. Это самая сложная часть, которая заставила меня застрять, Я думаю, что мне нужно использовать какой-то <> и нажимать слова, пока не найду следующее слово (в данном случае слово «Текст»), а затем вернусь назад (поместите «- WORD ") до первого случая, где я должен поставить« * » –

+0

@JessiPerotti Хорошо, я обновил свой ответ в соответствии с вашими требованиями. Я предполагаю, что если первые слова отличаются от «* word1 | word2», иначе он будет печатать «word1» – Shar1er80

+0

, это не только в случае первого слова. Это то, что я имею в виду http://prntscr.com/7xu345 –

0

Вот что я пробовал.

import java.util.*; 

public class SetDemo 
{ 
    public static void main(String[] args){ 
     String[] file1 = new String[]{"Some", "Simple", "Text", "File"}; 
     String[] file2 = new String[]{"Another", "Text", "File", "With", "Additional", "Lines"}; 
     Set<String> set1 = new HashSet<String>(); 
     Set<String> set2 = new HashSet<String>(); 

     for(String s: file1) 
      { 
       set1.add(s); 
      } 

     for(String s2: file2) 
      { 
       set2.add(s2); 
      } 

     Set<String> s1intercopy = new HashSet<String>(set1); 
     Set<String> s2intercopy = new HashSet<String>(set2); 

     s1intercopy.retainAll(s2intercopy); //Finds the intesection                                                     

     Set<String> s1symdiffcopy = new HashSet<String>(set1); 
     Set<String> s2symdiffcopy = new HashSet<String>(set2); 

     s1symdiffcopy.removeAll(set2); 
     s2symdiffcopy.removeAll(set1); 

     int count = 0; 
     for(String s7: s1intercopy){ 
      count++; 
      System.out.println(Integer.toString(count)+'.'+s7); 
     } 
     if (set1.size() > set2.size()) 
     { 
      for(String s3: s1symdiffcopy){ 
       count++; 
       System.out.println(Integer.toString(count)+'.'+'+'+s3); 
      } 
      for(String s4: s2symdiffcopy){ 
       count++; 
       System.out.println(Integer.toString(count)+'.'+'-'+s4); 
      } 
     }else if (set2.size() > set1.size()) 
     { 
      for(String s5: s2symdiffcopy){ 
       count++; 
       System.out.println(Integer.toString(count)+'.'+'+'+s5); 
      } 
      for(String s6: s1symdiffcopy){ 
       count++; 
       System.out.println(Integer.toString(count)+'.'+'-'+s6); 
      } 
     } 

    } 
} 

Выход:

1.Text 
2.File 
3.+Lines 
4.+Additional 
5.+Another 
6.+With 
7.-Some 
8.-Simple 

Я не был уверен, что вы имели в виду *Some|Another, но то, что этот код делает просто найти пересечение и симметричную между множествами, определить, какой набор больше, и присвойте '+' значениям, которые являются частью большего набора, а '-' - значениям меньшего набора. Я не читал из файла, чтобы сэкономить время, но эта часть проста, и вы можете это посмотреть. Кажется, что на вашем выходе вы просматривали один файл и для каждой строки в этом файле, просматривая другой файл. Это довольно неэффективно для больших файлов, поэтому я считаю, что вышеупомянутое решение оптимизирует это, сохраняя его в наборах и выполняя операции набора.

Смежные вопросы