не могу сравнить два файла.пока работа не работает - PullRequest
0 голосов
/ 02 октября 2011

РЕДАКТИРОВАТЬ:

У меня есть файлы, FileOne и FileTwo, которые в каждой строке есть слово или более.и я хочу сравнить эти два файла и посмотреть, является ли каждая строка fileOne одинаковой или частью строки FileTwo.Я сделал код ниже с вашими идеями, но я получаю небольшой результат, что означает, что он не проверяет все строки fileOne.Код ниже, не идет к следующему объекту it1?

    int index1 = 0;
    int index2 = 0;

    ArrayList <String> File1 = File2List(FileOne);
    Iterator it1 = File1.listIterator();
    ArrayList <String> File2 = File2List(FileTwo);
    Iterator it2 = File2.listIterator();

    while (it1.hasNext()) {
        String outer = it1.next().toString();
        while (it2.hasNext()) {
            String inner = it2.next().toString();
            index1 = outer.indexOf(inner);
            if(index1 != -1) { //Or compareIgnoreCase
                index2++;
                it1.next();
                break;
            }

        }
        it1.next();
    }

    System.out.println("Result: "+ index2);

Ответы [ 5 ]

1 голос
/ 02 октября 2011

Сначала (перед предложением решения по актуальной проблеме):

index1 = check.indexOf(toCheck);
if(index1 != -1){
    index2++;
    break; //mass1;
}

от

if(check.equals(checkTo)) { //Or equalsIgnoreCase
    index2++;
    break;
}

Поскольку строки Same start и Same start, diff end, безусловно, не совпадают.

Актуальная проблема:Вы читаете все содержимое файла2 в каждой строке файла 1.

Возможное решение

  1. Считайте содержимое файла1 (строка за строкой) и сохраните его в ArrayList File1
  2. Считать содержимое файла2 (строка за строкой) и сохранить его в другом ArrayList File2.
  3. Сравнить размер этих списков массивов друг с другом
  4. ЕслиВы не равны, верните (файлы определенно разные).
  5. Иначе, переберите каждый элемент ArrayList File1 и сравните, используя ранее описанную функцию, с ArrayList File2.
0 голосов
/ 02 октября 2011

Похоже, что вы не только хотите проверить все строки sin file1 против file2, но и определить строку, в которой они отличаются.

List<String> file1 = File2List(fileOne);
List<String> file2 = File2List(fileTwo);
for(int i=0;i<file1.size() && i<file2.size();i++)
    if(!file2.get(i).contains(file1.get(i))) {
        System.out.println("mismatch at line "+i);
        return;
    }
if (file1.size()<file2.size()) {
    System.out.println("file1 is shorter than file2");
    return;
}
if (file2.size()<file1.size()) {
    System.out.println("file2 is shorter than file1");
    return;
}
System.out.println("no mismatches found");
0 голосов
/ 02 октября 2011

Этот метод сделает работу.

private bool IsIdentical(string filePath1, string filePath2)
    {
        int file1Byte, file2Byte;
        FileStream fileStream1, fileStream2;

        //Open a stream to both files
        fileStream1 = new FileStream(filePath1, FileMode.Open);
        fileStream2 = new FileStream(filePath2, FileMode.Open);

        // Check the file sizes to determine if the files are identical.
        if (fileStream1.Length != fileStream2.Length)
        {
            fileStream1.Close();
            fileStream2.Close();
            return false;
        }

        //Read one byte from each file and compare them until either a non-matching 
        //set of bytes is found or until the end of the file.
        do
        {
            // Read one byte from each file.
            file1Byte = fileStream1.ReadByte();
            file2Byte = fileStream2.ReadByte();
        }
        while ((file1Byte == file2Byte) && (file1Byte != -1));

        fileStream1.Close();
        fileStream2.Close();

        return ((file1Byte - file2Byte) == 0);
    }
0 голосов
/ 02 октября 2011

Это то, что вы хотите?

package so7625322;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FindWords {

  private static List<String> loadLines(String fname) throws IOException {
    InputStream is = new FileInputStream(fname);
    try {
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
      List<String> lines = new ArrayList<String>();
      String line;
      while ((line = rd.readLine()) != null) {
        lines.add(line);
      }
      return lines;
    } finally {
      is.close();
    }
  }

  private boolean contains(Iterable<String> haystack, String needle) {
    for (String s : haystack) {
      if (s.contains(needle)) {
        return true;
      }
    }
    return false;
  }

  public boolean containsAll() throws IOException {
    List<String> words = loadLines("./NetBeansProjects/StemmerListComp/StemmedUnTunedQueries.txt");
    List<String> tocheck = loadLines("words-to-check");

    for (String s : tocheck) {
      if (!contains(words, s)) {
        return false;
      }
    }
    return true;
  }

}

Некоторые замечания:

  • Я разделил задачу на несколько небольших задач, так что основной метод containsAll выглядит каканалогично вашему требованию.
  • При использовании вспомогательного метода loadLines код также упрощается, поскольку вам больше не нужно беспокоиться о закрытии файлов в методе containsAll.
0 голосов
/ 02 октября 2011

Вы - одна строка из файла одна с каждой строкой из файла два.Это не работает.Вы должны получить следующие строки из первой файла во втором цикле.

Пример:

while (it1.hasNext()) {
    String outer = it1.next().toString();

    if(!it2.hasNext()) {
        // FALSE!
    } else {
        String inner = it2.next().toString();
        if(!inner.compare(outer)) { //Or compareIgnoreCase
            // FALSE
        }


    }
}

if(it2.hasNext()) {
    // FALSE
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...