有一个string类型数组arr ={ “a”, “b”, “d”, “d”, “a”, “d”, “a”, “e”, “d”, “c” },请编码实现统计该数组中字符重复次数并由多到少的顺序对a,b,c,d,e重新排序输出。(编码语言自选)
#!/usr/bin/env python
arr = ["a", "b", "d", "d", "a", "d", "a", "e", "d", "c"]
d = {}
for element in arr:
d[element] = arr.count(element)
print sorted(d.iteritems(), key = lambda d : d[1], reverse = True)
其实第一步将字母和次数存到一个dict之后,剩下的需求就是按照value从大到小来排列一个键值对即可,也就是字典按照value排序这个需求,因此只需要修改下sorted的参数即可
d.iteritems()这个参数是字典d的键值对的元组集合
key=这个参数是指排序的对象,这里用了lambda表达式,d[1]表示用字典的value来进行排序
reverse=这个参数True表示降序,False表示升序,默认为False,题目要求从多到少,所以是降序
用Java来实现
package Love;
import java.util.*;
/**
* Hello world!
*
*/
public class App
{
public static class ValueComparator implements Comparator<Map.Entry<String, Integer>> {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
}
public static void main( String[] args )
{
String[] arr = {"a", "b", "d", "d", "a", "d", "a", "e", "d", "c"};
Map<String, Integer> map = new HashMap<String, Integer>();
for (String myKey : arr) {
if (map.containsKey(myKey)) {
map.put(myKey, map.get(myKey) + 1);
}
else {
map.put(myKey, 1);
}
}
List<Map.Entry<String, Integer>> myList = new ArrayList<Map.Entry<String, Integer>>();
myList.addAll(map.entrySet());
ValueComparator vc = new ValueComparator();
Collections.sort(myList, vc);
for (Map.Entry<String, Integer> m : myList) {
System.out.println(m.getKey() + "=>" + m.getValue());
}
}
}
或者用迭代器输出
package Love;
import java.util.*;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
String[] arr = {"a", "b", "d", "d", "a", "d", "a", "e", "d", "c"};
Map<String, Integer> map = new HashMap<String, Integer>();
for (String myKey : arr) {
if (map.containsKey(myKey)) {
map.put(myKey, map.get(myKey) + 1);
}
else {
map.put(myKey, 1);
}
}
List<Map.Entry<String, Integer>> myList = new ArrayList<Map.Entry<String, Integer>>();
myList.addAll(map.entrySet());
Collections.sort(myList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
Iterator<Map.Entry<String, Integer>> iter = myList.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
这里有一个比较接口Comparator
package java.util;
public interface Comparator<T>
{
int compare(T o1, T o2);
boolean equals(Object obj);
}
其中compare方法必须要实现,equals可以不实现
compare是比较o1和o2的大小:
o1 < o2,返回负数
o1 = o2,返回0
o1 > o2,返回正数
这样就可以将此排序策略参数传递给排序类的某些方法,比如Collections.sort()
Collections提供以下方法对List进行排序操作
void reverse(List list),反转
void shuffle(List list),随机排序
void sort(List list),按自然排序的升序排序
void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑
void swap(List list, int i , int j),交换两个索引位置的元素
void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。
当distance为负数时,将list的前distance个元素整体移到后面。