Rank ArrayList< String>

Rank ArrayList<String> with int in java

我想在Java中使用一个EDCOX1(0)来表示字符串出现的次数。就像这样:如果我有

江户十一〔一〕号

我数了数"French","English","Belgium",etc.出现的数字。所以法语出现3次,英语出现2次,比利时出现2次,德语出现1次。然后我想把ArrayList按数字的函数排序。

结果将是:

1
2
3
4
French 3
English 2
Belgium 2
German 1

我该怎么做?如何关联整数和字符串?


不要再改造车轮,使用Collections类的frequency方法:

1
public static int frequency(Collection<?> c, Object o)

Returns the number of elements in the specified collection equal to
the specified object. More formally, returns the number of elements e
in the collection such that (o == null ? e == null : o.equals(e)).

如果需要计算所有元素的出现次数,请巧妙地使用映射和循环:)或者使用上面的frequency方法将列表放入集合并循环集合中的每个元素。高温高压

编辑/ Java 8:如果您想用LAMBDAS开发一个更具功能性的Java 8单线程解决方案,请尝试:

1
2
Map<String, Long> occurrences =
  list.stream().collect(Collectors.groupingBy(w -> w, Collectors.counting()));

然后按值对地图进行排序。


任何时候您需要关联数据时,都应该一直考虑MapHashMap是用于这个的基本类。因此,您可以迭代您的列表并在Map中创建关联。

1
2
3
4
5
6
7
8
9
10
11
12
List<String> stuff = new ArrayList<String>();
// ...populate it

Map<String, Integer> map = new HashMap<String, Integer>();    
for(String string : stuff) {
    if(map.containsKey(string)) {
        map.put(string, map.get(string) + 1);
    }
    else {
        map.put(string, 1);
    }
}

在这里查看完整的hashmap API。


您需要首先创建一个语言类:

1
2
3
4
5
6
7
8
9
public class Language {
  private String name;
  private int count;

  public Language(String name) { this.name = name; this.count = 0; }
  public String getName() { return this.name; }
  public int getCount() { return this.count; }
  public void setCount(int count) { this.count = count; }
}

然后,从数组列表中创建语言列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<String> languageNames = // your language names
Map<String, Language> map = new HashMap<String, Language>();

for (String languageName : languageNames) {
  Language language = map.get(languageName);
  if (language == null) {
    language = new Language(languageName);
  } else {
    language.setCount(language.getCount() + 1);
  }
  map.put(languageName, language);
}

List<Language> languages = new ArrayList<Language>(map.values());

之后,我们对语言进行排序和打印:

1
2
3
4
5
6
7
Collections<Language>.sort(languages, new Comparator<Language>() {
  public int compare(Language l1, Language l2) {
    return l1.getCount() - l2.getCount();
  }
});

System.out.println(languages);