Выявление повторяющихся номеров в текстовом файле - PullRequest
1 голос
/ 08 января 2012

Здесь я написал код Java для отображения повторяющихся чисел в текстовом файле. Здесь я жестко закодировал путь к текстовому файлу. Я предполагал, что текстовый файл содержит только цифры в каждой строке текстового файла.

И мне нравится отображать только те цифры, которые повторяются. Код как показано ниже:

import java.util.*;
import java.io.*;

public class FileRead {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<String,String> lines=new HashMap<String,String>();

    try{
        FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in=new DataInputStream(fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        ArrayList arr=new ArrayList();
        String str,str1;
        int i=0;
        while((str=br.readLine())!=null){
            i++;
            str1=Integer.toString(i);
            if(lines.containsValue(str)){
                System.out.println(str);
            }else{
                lines.put(str1, str);
            }
        }
        in.close();
    }catch(Exception e){
        System.out.println(e);
    }

}
}

Содержимое текстового файла показано ниже:

 56
 75
 1
 46
 100
 97
 75
 46
 46

Ожидаемый результат:

 75
 46

Это вывод, который я получаю:

 75
 46
 46

Я не могу найти ошибку в программе. Кто-нибудь может мне помочь ??

Ответы [ 4 ]

5 голосов
/ 08 января 2012

Вы должны были отслеживать, что вы напечатали, например, в HashSet<String>.

Объявите Set<String> seen = new HashSet<String>() вверху, затем добавьте if:

if(lines.containsValue(str)){
    if (seen.add(str)) {
        System.out.println(str);
    }
} else {
    lines.put(str1, str);
}

Еще более простым решением является удаление else:

if(lines.containsValue(str)){
    System.out.println(str);
}
lines.put(str1, str);
2 голосов
/ 08 января 2012

Проблема с этим фрагментом кода:

 if (lines.containsValue(str)){
     System.out.println(str);
  } else {
      lines.put(str1, str);
  }

46 повторяется 3 раза в файле. В первый раз lines не содержит 46, поэтому он будет добавлен к lines. Второй и третий раз он будет напечатан на экране, так как lines уже содержит 46.

2 голосов
/ 08 января 2012

Вам лучше использовать Set:

public static void main(String[] args) {

    final Set<Integer> set = new HashSet<Integer>();
    // Here a LinkedHashSet is used, this allows to print duplicates in
    // their order of appearance in the source file
    final Set<Integer> duplicates = new LinkedHashSet<Integer>(); 

    try{
        FileInputStream fstream = new FileInputStream("C:/Users/kiran/Desktop/text.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String str;
        int i;

        while((str = br.readLine())!=null){
            i = Integer.toString(str);

            // set.add() will return false if the set is NOT modified -- ie, her
            // it will return false if the integer is already there. Hence, dup.
            if (!set.add(i))
                duplicates.add(i);
        }
        in.close();

        for (final int dup: duplicates)
            System.out.println(dup);
    } catch(Exception e) {
        System.out.println(e);
    }
}
1 голос
/ 08 января 2012

Ваша ошибка логична. Число 46 появляется три раза в следующем файле. После того, как вы впервые встретитесь с ним, он будет присутствовать в хэше, и, таким образом, распечатывается на экране, когда вы сталкиваетесь с ним во второй и третий раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...