LINUX.ORG.RU

Java: Map + примитивные типы


0

0

Подскажите, есть ли в Java что-то наподобие dict Питона?
Нужно подсчитать, сколько раз встречается каждый символ в строке, то
есть нужен словарь [ключ (int || char) => value(int)].
Пока сделал на Map, но он хранит только объекты, т.е. пришлось
создавать свой класс для хранения одного int, что очень неудобно.
Можно ли как-нибудь сделать по-другому, попроще?

Делал когда-то такую задачку от скуки. Яву не изучал, не знаю, и знать не хочу. 

Вот что получилось (предположим, что строка хранится в файле): 

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
 
public class CountCharacters {
    public static void main(String[] args) throws IOException {
        FileReader inputStream = null;
        
        try {
            inputStream = new FileReader('somefile');
            HashMap<Character, Integer> characters = new HashMap<Character, Integer>();

            int c;
            while ((c = inputStream.read()) != -1) {
                if (characters.containsKey((char) c) == true) {
                    characters.put((char) c, 
                        new Integer(characters.get((char) c) + 1));
                } else {
                    characters.put((char) c, new Integer(1));
                }
            }
            System.out.println(characters.toString());
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }
}


В то время, как питоне аналогичное будет выглядеть примерно так:

from collections import defaultdict

characters = defaultdict(int)
    for char in open('somefile').read():
        characters[char] += 1
print characters


Все-таки ява это действительно удивительно многословное, невыразительное и унылое говно.

anonymous
()
Ответ на: комментарий от anonymous

1. try-finally здесь не нужен
2. Вместо new Integer надо писать Integer.valueOf
3. toString тоже не нужен.
Т.е. джавы вы действительно не знаете, и берётесь утверждать всякие бредовые вещи.

4. При желании несложно сообразить практически построчный аналог:
Map<Character, Integer> characters = new DefaultHashMap<Character, Integer>();
for (Character c : new File('somefile').getCharList())
    characters.put(c, characters.get(c) + 1);

Legioner ★★★★★
()
Ответ на: комментарий от Burbaka

Для юникодных символов немаленький массив нужен.

anonymous
()
Ответ на: комментарий от anonymous

> for char in open('somefile').read():

Любопытно, кстати, как это будет работать с большим файлом. Будет пытаться засосать всё его содержимое в память?

execve
()
Ответ на: комментарий от execve

> Любопытно, кстати, как это будет работать с большим файлом. Будет пытаться засосать всё его содержимое в память?

Дык, что-то питон вообще рассосался. Раньше он сосал только у перла, теперь у всех остальных. :)

eveel ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.