2013-06-17 3 views
2

У меня есть программа, которая учитывает вхождения слов в заданном массиве. Он хранит слова и его количество. Например, в данном массиве:Как заменить HashMap <String, Integer> на массив?

String array[] = {"cat", "dog", "cat"}; 

У меня есть 2 кошки и 1 собака. Делая это с HashMap довольно прост:

HashMap<String, Integer> map = new HashMap<>(); 
for (int i = 0; i < wordarray.length; i++) { 
    String word = wordarray[i].toLowerCase(); 
    if (map.containsKey(word)) { 
     map.put(word, map.get(word) + 1); 
    } else { 
     map.put(word, 1); 
    } 
} 

Тогда мне просто нужно распечатать его:

for (Map.Entry<String, Integer> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " : " + entry.getValue()); 
} 

Но есть ли способ сделать это без HashMap только с использованием массивов объектов?

+3

Два измерения массив ?? – Omar

+0

Причина использования HashMap заключается в том, что он имеет уникальные ключи, такие как Set. Таким образом, вы можете проверить, существует ли строка, которую вы ищете, без необходимости перебирать весь массив. –

+0

Реализация/повторное использование хеш-таблицы с открытой адресацией (http://en.wikipedia.org/wiki/Open_addressing)? –

ответ

4

Создайте собственный класс для хранения значений строки и int, а затем используйте массив для их хранения. В псевдокоде:

class Myclass 
public int myInt; 
public string MyString; 
//Constructor omited.. 


//Somewhere else.. 
MyClass[] my = new Myclass[2]; 
my[0] = new MyClass("string", 1); 
+0

милый один :) Я попробую! – mazix

1

Это намного-намного медленнее, чем при использовании HashMap, но он должен работать:

Допустим, вы уверены, что в тексте слова больше, чем N раз (в качестве верхней границы вы можете выбрать общее количество слов в тексте). После этого вы можете выделить массив такого размера N из ArrayList элементов: a = new ArrayList[N]; for (int i = 0; i < N; i++) a[i] = new ArrayList<String>();

Тогда для каждого слова w, вы будете перебирать этот массив, найти ячейку с индексом c с ArrayList<String>, который содержит w и двигаться w из c в c+1 (с использованием list.remove(Object) и list.add(Object)). Если ячейка не найдена, добавьте w в первую ячейку: a[0].add(w).

Некоторые оптимизации:

  • использование HashSet в массиве вместо ArrayList, хотя это выглядит неуместно в вашем случае;
  • использовать массив массивов [N][N] размер. Будет больше потребления памяти, но меньше времени.
1

Вы можете проверить реализацию Карты, используя массивы. Вот хороший article об этом