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 |
我该怎么做?如何关联整数和字符串?
- 寻找以更干净/更有效的方式将字符串与int关联的可能副本
- 分析arraylist并创建一个以"language"为键、以"count"为值的映射。
不要再改造车轮,使用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())); |
然后按值对地图进行排序。
- 我不赞成frequency的评论,因为它仍然要求编码人员迭代List,并以某种方式存储/关联这些值。但是生病Java 8技能的1。:)
- 我不明白你的回答…当我在列表中尝试.stream()时,此方法不存在…
- @ MOMO70升级到Java 8并享受功能界面!还有什么你不明白的吗?
- 我在这里找到了一个解决方案,但是在Okiharahberst,什么是w -> w?
- @ MOMO70,EDOCX1,5称为lambda表达式,并在第八版本中被引入Java,以便给语言带来一些功能编程结构。看看DOCS.Oracle .com/JavaSe/Tube/Java/JavaOO//Helip;和Oracle .com/WebFask/TeaTeWorks/Toograse/OBE/Java/Helip;如果您感兴趣的话,需要一个关于该主题的入门书。Hth.
任何时候您需要关联数据时,都应该一直考虑Map。HashMap是用于这个的基本类。因此,您可以迭代您的列表并在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。
- 谢谢,这就是我要找的。但是如何排列地图呢?
- @用户3590882很高兴它帮助了您。:)就订购HashMap而言,通常情况下,您不会。一个HashMap基本上是无序的。如果您想基于键进行排序,可以使用TreeMap,但是如果您想对值进行排序,正如我怀疑的那样,这会变得更加困难,特别是因为可以有相同的值(而键是唯一的)。您可以查看此问答以了解更多信息。
- 我做了这个map=new treemap(map);我让map按字符串排序,但是如何按键值排序?我试过map=new treemap(map.values);但它无法识别…附言:如何在这个论坛里写一个类似代码的文本?
您需要首先创建一个语言类:
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 ); |
。
- 如何在Jeff Gohlke的代码中使用这个?因为他的代码在我的数组列表上工作,而你的代码与我需要的不一样,所以我必须使你的代码适应我的。但是怎么做呢?我应该只看第三部分关于收集的内容吗?
- OP希望用Java中的int来排序列表,粗略地转换成使用地图。难道你不认为全班奉献给这件事有点太僵硬了吗?
- 我们可以避免使用类。但是,我们需要以某种方式将语言名称与其频率(出现次数)绑定起来。语言类用于此目的。