число элементов вхождения - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь найти номер вхождения элемента, используя treeset и hashmap. когда я запускаю программу, значение не увеличивается в hashmap

Я пробовал map.put (data, map.get (data) +1), это вызывает исключение нулевого указателя.

public class ReadData {
    public static void main(String[] args) {
        File f = new File("E:\\new1.txt");
        try {
            BufferedReader br = new BufferedReader(new FileReader(f));
            String data = "";
            int count =1;
            HashMap<String,Integer> map = null;
            TreeSet<String> set = new TreeSet<String>();
            set.add("");
            while((data=br.readLine())!=null) {

                 map = new HashMap<String,Integer>();
            if(set.contains(data)) {
                map.put(data,map.get(data)+1);
                System.out.println("correct");
                System.out.println(count+1);

            }else
            {
                map.put(data,count);
                set.add(data);
                System.out.println("Not correct");
            }
            //System.out.println(map);
             Set sets = map.entrySet();
              Iterator iterator = sets.iterator();
              while(iterator.hasNext()) {
                 Map.Entry mentry = (Map.Entry)iterator.next();
                System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
                 System.out.println(mentry.getValue());

              }
            }

        }catch(Exception e) {
            System.out.println(e);
        }

    }
}

ввод: - оранжевый яблоко оранжевый оранжевый

ожидаемая клавиша o / p оранжевого цвета и значение 3 ключ - яблоко, значение - 1

Вывод ключа: оранжевый и значение: 1 Ключ: яблоко и значение: 1 java.lang.NullPointerException

Ответы [ 4 ]

3 голосов
/ 04 июля 2019

Вы можете сделать это чище, используя потоки, с Collectors.groupingBy() и Collectors.counting(). Вы также должны использовать try-with-resource construct и новый Files class:

String delimiter = " ";
Path p = Paths.get("E:", "file.txt");
try (BufferedReader br = Files.newBufferedReader(p)) {
    Map<String, Long> result = br.lines()
            .flatMap(l -> Arrays.stream(l.split(delimiter)))
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    System.out.println(result);
}

Для ввода orange apple orange orange этот код напечатает {orange=3, apple=1}.

0 голосов
/ 07 июля 2019

Вы также можете использовать TreeMap вместо HashMap + TreeSet.

public class ReadData {
    public static void main(String[] args) {
        try {
            File f = new File("E:\\new1.txt");
            BufferedReader br = new BufferedReader(new FileReader(f));
            TreeMap<String,Integer> map = new TreeMap(String, Integer);

            while((String data=br.readLine()) != null) {

                String[] fruitNames = data.split(" "); // or regex s+ can also be used

                for(String fruitName : fruitNames){
                    Integer count = map.get(fruitName);
                    Integer newVal = count == null ? 1 : count+1 ;
                    map.put(fruitName, newVal);
                }
                // iterate over keys in TreeMap
            }
        }catch(Exception e) {
            System.out.println(e);
        }

    }
}
0 голосов
/ 07 июля 2019

Если вы хотите посчитать вхождения строки, вы можете просто использовать StringUtils.countMatches из Apache Commons lang.

//First get all the words from your line - 
String[] allWords = data.split("\\s");

//Retrieve unique strings
        String[] uniqueStrings = Arrays.stream(allWords).distinct().toArray(String[]::new);

// Print the occurrence of each string in data
        for (String word: uniqueStrings){

               System.out.println("Count of occurrences for the word " + word + "is: " + StringUtils.countMatches(data, word));
        }
0 голосов
/ 04 июля 2019

Обратите внимание, что

    HashMap<String,Integer> map = null;

- это не то же самое, что пустая карта.Прежде всего, вы должны создать новую карту, прежде чем использовать ее.

Если в этом случае использовать, например,

        HashMap<String,Integer> map = null;

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

map = new HashMap<String,Integer>();

внутри цикла while

Ваш код должен выглядеть как

HashMap<String, Integer> map = new HashMap<String, Integer>();
            TreeSet<String> set = new TreeSet<String>();
            set.add("");
            while ((data = br.readLine()) != null) {
...