2

I have a program that count occurrences of words in given array. It keeps words and its quantity. For example, in given array:

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

I have 2 cats, and 1 dog. Making it with HashMap is quite simple:

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);
    }
}

Then I just need to print it out:

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

But is there any way to make it without HashMap only using arrays of objects?

4

4 回答 4

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);
于 2013-06-17T15:49:16.600 回答
3

您可以创建 Map.Entry 键/值对的列表/数组。

已经有一种方法可以为您做到这一点HashMapentrySet()

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#entrySet()

于 2013-06-17T15:49:35.273 回答
1

这比 using 慢得多HashMap,但它应该可以工作:

假设您确定文本中没有出现任何单词超过N多次(作为上限,您可以选择文本中的单词总数)。然后你可以分配NArrayList 元素大小的数组:a = new ArrayList[N]; for (int i = 0; i < N; i++) a[i] = new ArrayList<String>();

然后,对于每个 word w,您将遍历该数组,找到c具有ArrayList<String>包含的索引的单元格并从tow移动(使用and )。如果未找到单元格,请添加到第一个单元格中的列表:。wcc+1list.remove(Object)list.add(Object)wa[0].add(w)

一些优化:

  • 使用HashSetin array 而不是ArrayList,尽管它在您的情况下看起来不合适;
  • 使用大小数组的数组[N][N]。会有更多的内存消耗,但花费的时间更少。
于 2013-06-17T15:57:34.580 回答
1

您可以使用数组检查 Map 的实现。这是一篇关于这个的好文章

于 2013-06-17T16:32:57.730 回答