您可以通过两个步骤解决此问题:
>创建一个计数器对象 – 一个Map< String,Integer>列出每个字符串在输入中出现的次数:换句话说,它是一个频率图.这是O(n),因为您只需要遍历输入一次以构建地图
>使用上一个地图,创建一个包含其键的列表,使用项目的频率(地图中的值)作为排序标准进行排序.这是O(n log n),您可以使用比较器调用Collections.sort(),该比较器使用字符串频率进行比较
这就是我的意思:
String[] stringArray = {"x","a"};
final Map counter = new HashMap();
for (String str : stringArray)
counter.put(str,1 + (counter.containsKey(str) ? counter.get(str) : 0));
List list = new ArrayList(counter.keySet());
Collections.sort(list,new Comparator() {
@Override
public int compare(String x,String y) {
return counter.get(y) - counter.get(x);
}
});
执行上述代码后,变量列表将包含以下值(未指定相同频率的元素之间的顺序):
[x,y,a,z]
将列表转换为数组是微不足道的:
list.toArray(new String[list.size()])
如果你需要找出每个字符串的频率,只需遍历排序的键:
for (String str : list) {
int frequency = counter.get(str);
System.out.print(str + ":" + frequency + ",");
}