Rank ArrayList<;字符串>;在java中使用int

Rank ArrayList<;字符串>;在java中使用int,java,string,integer,Java,String,Integer,我想在java中对ArrayList中的字符串显示次数进行排名。 就像这样:如果我有一个 ArrayList=[法语、英语、德语、法语、法语、比利时、英语、比利时] 我数出现的“法语”、“英语”、“比利时”等的数字。所以法语出现了3次,英语出现了2次,比利时出现了2次,德语出现了1次。然后我想根据数字对ArrayList进行排序 结果将是: French 3 English 2 Belgium 2 German 1 我怎么能做到?如何关联整数和字符串?每当需要关联数据时,您都应该一直考虑Ma

我想在java中对
ArrayList
中的字符串显示次数进行排名。 就像这样:如果我有一个

ArrayList=[法语、英语、德语、法语、法语、比利时、英语、比利时]

我数出现的
“法语”、“英语”、“比利时”等的数字。所以法语出现了3次,英语出现了2次,比利时出现了2次,德语出现了1次。然后我想根据数字对
ArrayList
进行排序

结果将是:

French 3
English 2 
Belgium 2
German 1

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

每当需要关联数据时,您都应该一直考虑
Map
HashMap
是用于此操作的基本类。因此,您可以迭代列表,并在
映射中创建关联

List stuff=new ArrayList();
//…填充它
Map Map=newhashmap();
for(字符串:stuff){
if(map.containsKey(字符串)){
map.put(字符串,map.get(字符串)+1);
}
否则{
map.put(字符串,1);
}
}

查看完整版本。

不要重新发明轮子,使用
集合
类的
频率
方法:

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

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

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

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; }
}
然后,从ArrayList创建语言列表:

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());
List languageNames=//您的语言名称
Map Map=newhashmap();
for(字符串languageName:languageNames){
Language=map.get(languageName);
if(语言==null){
语言=新语言(languageName);
}否则{
language.setCount(language.getCount()+1);
}
map.put(languageName,language);
}
列表语言=新的ArrayList(map.values());
然后,我们对语言进行排序和打印:

Collections<Language>.sort(languages, new Comparator<Language>() {
  public int compare(Language l1, Language l2) {
    return l1.getCount() - l2.getCount();
  }
});

System.out.println(languages);
Collections.sort(语言,新比较器(){
公共整数比较(l1语言、l2语言){
返回l1.getCount()-l2.getCount();
}
});
System.out.println(语言);

解析arrayList并创建一个映射,其中“language”作为键,“count”作为值。我不会对
频率
注释投赞成票,因为它仍然要求编码器迭代
列表
并以某种方式存储/关联值。但是对于病态的Java 8技能+1.:)我不明白你的答案。。。当我尝试列表中的.stream()时,此方法不存在…@momo70升级到Java 8并享受功能接口!还有什么你不明白的吗?我找到了一个解决方案,但是@okiharaherbst什么是
w->w
?@momomo70,
w->w
被称为lambda表达式,并在Java的第8版中被引入到Java中,为语言引入了一些函数式编程结构。如果你对这个话题感兴趣,需要一本入门读物,请看一看。谢谢,这就是我要找的。但是如何给地图排名呢?@user3590882很高兴它能帮助你。:)至于排序
HashMap
,通常情况下,您确实不需要。
HashMap
基本上是无序的。如果您想基于键进行排序,可以使用
树映射
,但是如果您想对值进行排序,正如我所怀疑的,这会变得有点困难,特别是因为可以有相同的值(而键是唯一的)。你可以去看看。我做了这个地图=新树地图(地图);我有按字符串排序的映射,但是如何按键值排序呢?我尝试了map=newtreemap(map.values);但它不被认可。。。PS:如何在这个论坛上写一个像代码一样的文本?如何在杰夫·高尔克的代码上使用这个?因为他的代码在我的ArrayList上工作,而你的代码与我需要的不一样,所以我必须使你的代码适应我的代码。但是怎么做呢?我应该只讲集合的第三部分吗?OP想用Java中的int对列表进行排序,这大致可以转换为使用映射。你不觉得把一整节课都花在这上面有点太难了吗?我们可以避免使用类。但是,我们需要以某种方式将语言名称与其频率(出现次数)绑定在一起。Language类用于此目的。
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());
Collections<Language>.sort(languages, new Comparator<Language>() {
  public int compare(Language l1, Language l2) {
    return l1.getCount() - l2.getCount();
  }
});

System.out.println(languages);