简介
首先,我想首先说我正在学习java,所以如果我在做任何低效或可以做得更好的事情,请告诉我。
我要做的是按键按字母顺序对HashMap进行排序,然后按顺序返回值列表。在谷歌搜索之后,我发现我可以使用SortedSet轻松地对HashMap进行排序,但后来我遇到了如何将树集合到数组中的问题?
示例
像这样的输入:
{“apple”,“pear”,“cherry”,“apple”,“cherry”,“pear”,“apple”, “香蕉”}
应该返回:
{3,1,2,2}
我的代码(到目前为止)
import java.util.*;
public class SortedFreqs {
public int[] freqs(String[] data) {
HashMap<String, Integer> myMap = new HashMap<String, Integer>();
for (String s: data){
if (!myMap.containsKey(s)){
myMap.put(s, 0);
}
myMap.put(s, myMap.get(s)+1);
}
SortedSet<Integer> values = new TreeSet<Integer>(myMap.values());
}
}
答案 0 :(得分:3)
SortedSet extends Collection定义方法toArray:
Integer[] toArray = values.toArray(new Integer[values.size()]);
但是,有一个问题是集合使用泛型,并且您的方法被定义为返回int[]
的原始数组。没有内置的方法可以将int[]
转换为Integer[]
,因此您需要更改方法签名或自行复制数组:
int[] primitives = new int[toArray.length];
for(int i = 0; i < toArray.length; i++) {
primitives[i] = toArray[i].intValue();
// or just = toArray[i];
// because intValue is called automagically by the compiler
}
虽然,实际上,你似乎应该回到地图。如果你想按字母顺序返回它,可以使用TreeMap而不是HashMap。
如果您真的想按照OP中描述的方式进行操作,则需要按键对值进行排序。问题是new TreeSet<Integer>(myMap.values())
以数字方式对整数进行排序。所以你需要做类似的事情:
Collection<Integer> values = new TreeMap<String, Integer>(myMap).values();
Integer[] toArray = values.toArray(new Integer[values.size()]);
但我建议你回一张地图。因为否则很难分辨哪些数字与哪个字符串相对应。
答案 1 :(得分:0)
解决这个问题,感谢您的评论和回复。真的很有帮助。
import java.util.*;
public class SortedFreqs {
public int[] freqs(String[] data) {
int count = 0;
TreeMap<String, Integer> myMap = new TreeMap<String, Integer>();
for (String s: data){
if (!myMap.containsKey(s)){
myMap.put(s, 0);
count++;
}
myMap.put(s, myMap.get(s)+1);
}
int [] ans = new int [count];
int c = 0;
for (String i: myMap.keySet()){
ans[c] = myMap.get(i);
c++;
}
return ans;
}
}
答案 2 :(得分:0)
public static Integer[] freqs(String[] data) {
HashMap<String, Integer> myMap = new HashMap<String, Integer>();
for (String s : data) {
if (!myMap.containsKey(s)) {
myMap.put(s, 0);
}
myMap.put(s, myMap.get(s) + 1);
}
return new TreeMap<String, Integer>(myMap).values().toArray(new Integer[myMap.size()]);
}