Чтение текстового файла в Java - PullRequest
0 голосов
/ 05 января 2012

Здесь я пытаюсь прочитать текстовый файл, содержащий только целые числа в каждой строке. Например:

1 
2 

3 
1

Я написал следующий код для чтения текстового файла. Код как показано ниже.

 package fileread;
 import java.io.*;

 public class Main {


public static void main(String[] args) {
    // TODO code application logic here
    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;
        while((str=br.readLine())!=null){
            System.out.println(str);
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}

Теперь я хочу получить только те целые числа, которые повторялись, и отобразить их пользователю. В этом случае я хочу отобразить «1».

Как я могу реализовать это в Java ??

Ответы [ 8 ]

1 голос
/ 05 января 2012
package fileread;
import java.io.*;
import java.util.HashSet;
import java.util.Set;

public class Main {


public static void main(String[] args) {
    Set<String> uniqueLines = new HashSet<String>();
    Set<String> duplicatedLines = new HashSet<String>();
    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;
        while((str=br.readLine())!=null){
            if (uniqueLines.contains(str)) {
                if (!duplicatedLines.contains(str)) {
                    duplicatedLines.add(str);
                    System.out.println(str);
                }
            } else {
                uniqueLines.add(str);
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}

Примечание. Убедитесь, что в вводе нет пробелов в каждой строке.Также обратите внимание, что когда список становится длинным, эта реализация не особенно удобна для памяти.

1 голос
/ 05 января 2012

Вам необходимо прочитать значение в массиве, а затем найти повторяющиеся записи в этом массиве.

0 голосов
/ 05 января 2012

Я бы использовал подход с двумя наборами;

public static void main(String[] args) {
    Set<Integer> result = new HashSet<Integer>();
    Set<Integer> temp = new HashSet<Integer>();

    try{
        FileInputStream fstream=new FileInputStream("text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            if (!"".equals(str.trim())){
                try {
                    Integer strInt = new Integer(str.trim());
                    if(temp.contains(strInt)){
                        result.add(strInt);
                    } else {
                        temp.add(strInt);
                    }
                } catch (Exception e){
                    // usually NumberFormatException
                    System.err.println(e);
                }
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
    for(Integer resultVal : result){
        System.out.println(resultVal);
    }
}

В качестве альтернативы, вы также можете использовать один HashMap с HashMap.Key в качестве Integer и HashMap.Value в качестве счетчика для этого Integer.Затем, если вам позже потребуется рефакторинг, чтобы найти все экземпляры с одним вхождением, вы можете легко это сделать.

    public static void main(String[] args) {
    Map<Integer, Integer> frequency = new HashMap<Integer, Integer>();

    try{
        FileInputStream fstream=new FileInputStream("text.txt");
        DataInputStream in=new DataInputStream (fstream);
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String str;
        while((str=br.readLine())!=null){
            if (!"".equals(str.trim())){
                try {
                    Integer strInt = new Integer(str.trim());
                    int val = 1;
                    if(frequency.containsKey(strInt)){
                        val = frequency.get(strInt).intValue() + 1;
                    } 
                    frequency.put(strInt, val);
                } catch (Exception e){
                    // usually NumberFormatException
                    System.err.println(e);
                }
            }
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
    // this is your method for more than 1
    for(Integer key : frequency.keySet()){
        if (frequency.get(key).intValue() > 1){
            System.out.println(key);
        }
    }
    // This shows the frequency of values in the file. 
    for(Integer key : frequency.keySet()){
        System.out.println(String.format("Value: %s, Freq: %s", key, frequency.get(key)));
    }
}

Будьте осторожны с NumberFormatExceptions и, в зависимости от вашей ситуации, вы можете обрабатывать их внутри циклаили вне цикла.

0 голосов
/ 05 января 2012

Прежде всего, я бы определил 1 список и 1 набор целых чисел, как показано ниже:

ArrayList<Integer> intList = new ArrayList<Integer>();
Set<Integer> duplicateIntSet = new HashSet<Integer>(); //Set is used to avoid duplicates

А затем я бы проверил наличие дубликатов и добавил их в соответствующие списки, как показано ниже:

while((str=br.readLine())!=null){
    if(!str.isEmpty()) {
        Integer i = Integer.parseInt(str);

        if(intList.contains(i)) {
            duplicateIntSet.add(i);
        } else {
            intList.add(i);
        }
    }
}
0 голосов
/ 05 января 2012

как то так

package fileread;

import java.io.*;

import java.util.*;

public class Main {

public static void main(String[] args) {

    Hashtable ht = new Hashtable();

    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;

        while((str=br.readLine())!=null){

            String sproof = (String) ht.get(str.trim());
            if (sproof != null && sproof.equals("1")) {
                System.out.println(str);
            } else {
                ht.put(str.trim(), "1");
            } 
        }
        in.close();
    }
    catch(Exception e){
        System.err.println(e);
    }
}

}
0 голосов
/ 05 января 2012

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

0 голосов
/ 05 января 2012

Ну, вы можете использовать массив с 10 слотами, который отображается на число от 0 до 9. Для каждой строки вы проверяете, что это за число, и соответственно увеличиваете значение в массиве. Это было бы что-то вроде этого:

// Initialize the array
int[] numberArray = new int[10];
for (int i = 0 ; i < 10 ; i++) numberArray[i] = 0;

while((str=br.readLine())!=null){
   int number = Integer.parseInt(str);
   numberArray[number]++;
}

for (int i = 0 ; i < 10 ; i++) {\
   if (numberArray[i] > 1) System.out.println(i);
}
0 голосов
/ 05 января 2012

Полностью прочитайте файл, сохраните строки в выбранной вами структуре данных (карта (ключ = строка, значение = число), массив, если только целые числа), перечислите структуру данных и распечатайте их, значение которых больше 1 ( если значение представляет количество).

или «на лету»: прочитайте файл, добавьте запись в набор / список / массив, если он не содержится в наборе / списке / массиве, иначе выведите строку.

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