2013-11-20 3 views
0

вот мой код:сравнения двух файлов посимвольно

public static void main(String[] args) { 
    Scanner console = new Scanner(System.in); 
    System.out.print("Type first file name to use: "); 
    String filename1 = console.nextLine(); 
    System.out.print("Type second file name to use: "); 
    String filename2 = console.nextLine(); 
    Scanner input1 = new Scanner(new File(filename1)); 
    Scanner input2 = new Scanner(new File(filename2)); 
    String s1 = input1.next(); 
    String s2 = input2.next(); 
    boolean similar=true;r 
while(!input1.hasNext()&&!input2.hasNext()){ 
// this is where i am stuck. i need to compare the lines character by character, but i'm not sure how to do so. i can't use buffer method, or any really advanced methods since i am just a beginner, so sticking to the basic loops (while, iff, for..) is the only option i have 
} 

программа должна предложить пользователю ввести два имени файла и печатает истинным или ложным в зависимости от того или нет файлы имеют один и тот же contents.It должен проверять символ файлов по символу и игнорировать разницу (в верхнем и нижнем регистре) в случае символов, которые являются буквами. Спасибо.

+0

Интересно, если бы вы могли Хэш файла и сравнить Hash, чтобы сэкономить много времени и накладных расходов. –

+0

Предполагая, что у вас есть проблемы в строке, которую вы прокомментировали, ваш вопрос действительно «как мне сравнить две строки». В этом случае используйте equals: 'if (! Input1.next(). Equals (input2.next())) {/ * not-equal * /}'. Если вам действительно нужен char по char, используйте цикл для своих символов, извлеченный через, скажем, 'input1.next(). ToCharArray()' – tucuxi

+0

@ user2860598: Хеширование требует перебора полного файла, поэтому в этом случае он менее эффективен , –

ответ

0

Использование:

if (s1.equalsIgnoreCase(s2)) { 
    // All characters on the entire line are equal. 
} else { 
    // There is a difference 
} 

Он сравнивает символьные строки с помощью символа на одну строку за один раз.

Вы можете создать цикл, но для этого потребуется больше кода и приведет к ухудшению производительности.

+0

Я просто добавляю это в мой цикл while? или я должен создать логический метод, который возвращает true или false? – abedzantout

0

посимвольно и не позволяя существующим структурам делать любую работу ?, как насчет ...

while(!input1.hasNext()&&!input2.hasNext()) 
{ 
    char c1 = input1.next("."); 
    char c2 = input2.next("."); 

    if (c1!=c2) 
    { 
    //Files are not equal 
    } 
} 
+1

вид overkill для использования следующего («aRegex») вместо циклического вызова charAt (i) - хотя Java может делать небольшое кэширование регулярных выражений, чтобы избежать создания и удаления этого объекта. – tucuxi

+0

Для эффективности я согласен с вами. OP выглядит как новичок, хотя решение с регулярным выражением просто запутывает. Я попытался пойти на простое и легко усваиваемое решение, которое ОП может изменить, как только они поймут эту идею. –

+1

, но следующий (".") Эквивалентен следующему (Pattern.compile (".")) - вы на самом деле выступаете за использование регулярных выражений – tucuxi

0

Вы можете обрабатывать файлы обугливается-на-гольца, если вы хотите, используя экземпляр Reader. Что-то вроде:

BufferedReader reader1 = new BufferedReader(new FileReader("fileName1")); 
BufferedReader reader2 = new BufferedReader(new FileReader("fileName2")); 
int char1; // from first file 
int char2; // from second file 
// loop until the end of either file is reached 
while ((char1 = reader1.read()) != -1 && (char2 = reader2.read()) != -1) { 
    // convert current characters from both files to lowerCase 
    char lowerCase1 = Character.toLowerCase((char) char1); 
    char lowerCase2 = Character.toLowerCase((char) char2); 
    if (lowerCase1 != lowerCase2) { 
     System.out.println("your text files are different!"); 
     return; 
    } 
} 
+0

Мне не разрешено использовать Reader – abedzantout

0

Вы должны сделать что-л так:

public static void main(String[] args) { 
    Scanner console = new Scanner(System.in); 
    System.out.print("Type first file name to use: "); 
    String filename1 = console.nextLine(); 
    System.out.print("Type second file name to use: "); 
    String filename2 = console.nextLine(); 
    Scanner input1 = new Scanner(new File(filename1)); 
    Scanner input2 = new Scanner(new File(filename2)); 
    String s1 = input1.next(); 
    String s2 = input2.next(); 
    boolean similar=true;r 
    while(!input1.hasNext()&&!input2.hasNext()){ 
     if (a.findInLine(".").compareToIgnoreCase(b.findInLine(".")) != 0) { 
      similar = false; 
      break; 
     } 
    } 

    if (similar && (a.hasNext() || b.hasNext())) // unequal sizes 
     similar = false; 
    System.out.println("Files are " + (similar ? "equal" : "unequal")); 
    return 0; 
} 
+0

Какой самый простой способ сделать? спасибо :) – abedzantout

+0

@ Predator44 Отредактировано как почти рабочее решение. Извините, непроверено, но должно работать. – Seagull

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