按照字符串的频率对列表进行排序

时间:2013-03-13 05:40:41

标签: java

列表是

List<String> list = new ArrayList<String>();

list.add("apple");
list.add("ball");
list.add("apple");
list.add("cat");
list.add("ball");

现在我必须按照苹果,球,猫的频率对此列表进行排序

我必须得到输出:

apple
ball
cat

4 个答案:

答案 0 :(得分:2)

首先,计算字符串的出现次数,然后使用Map

进行排序
List<String> list = new ArrayList<String>();
list.add("apple");
list.add("ball");
list.add("apple");
list.add("cat");
list.add("ball");
Map<String, Integer> map = new HashMap<String, Integer>();
for (String s : list) {
    if (map.containsKey(s)) {
        map.put(s, map.get(s) + 1);
    } else {
        map.put(s, 1);
    }
}
ValueComparator<String, Integer> comparator = new ValueComparator<String, Integer> (map);
Map<String, Integer> sortedMap = new TreeMap<String, Integer> (comparator);
sortedMap.putAll(map);

List<String> sortedList = new ArrayList<String> (sortedMap.keySet());

System.out.println(sortedMap);
System.out.println(sortedList);

}

static class ValueComparator<K, V extends Comparable<V>> implements Comparator<K> {

Map<K, V> map;

public ValueComparator(Map<K, V> base) {
    this.map = base;
}

@Override
public int compare(K o1, K o2) {
     return map.get(o2).compareTo(map.get(o1));
}
}

答案 1 :(得分:0)

您可以创建一个自定义列表,其中包含一个地图,用于记录列表中元素的频率。

pulic class FrequencySortList<E> extend ArrayList<E> {

  private Map<E,Integer> frequency = new HashMap<E,Integer>();


  .....




}

答案 2 :(得分:0)

试试这个,

List list = new ArrayList();
         list.add("apple");
         list.add("ball");
         list.add("apple");
         list.add("cat");
         list.add("ball");

         // sort the list
         Collections.sort(list);

此处列表包含:

apple
apple
ball
ball
cat
         List list2 = new  ArrayList();

         for(int i=0;i<list.size();i++)
         {
             if(!list2.contains(list.get(i)))
             {
                 list2.add(list.get(i));
             }

         }
         for(int i=0;i<list2.size();i++)
         {

             System.out.println(list2.get(i));
         }

list2将打印:

apple
ball
cat

或者你可以像使用评论

中提到的jahroy一样使用这一行
List list2 = new ArrayList<String>(new TreeSet<String>(list));

答案 3 :(得分:0)

首先,您需要将简单的类作为模型:

public class Thing {

        String name;
        int total;

        public Thing(String name){
            this.name=name;
            total=1;
        }

       //setter and getter
    }

然后你需要计算出事物的频率:

List list = new ArrayList();
list.add("apple");
list.add("ball");
list.add("apple");
list.add("cat");
list.add("ball");
System.out.println(list.size());
List list2 = new ArrayList();
for(int i=0;i<list.size();i++){
    System.out.println(list.get(i));
    Thing thing= new Thing(list.get(i).toString());
    if(list2.size()<1){
        list2.add(thing);
    }else {
        boolean insert=true;
        int x=0;
        for(int j=0;j<list2.size();j++){
            Thing toCompare=(Thing)list2.get(j);
            if(toCompare.getName().equals(thing.getName())){
                insert=false;
                x=j;
                thing.setTotal(thing.getTotal()+1);
                break;
            }
        }
        if(insert==true){
            list2.add(thing);
        }else{
            list2.set(x, thing);
        }
    }
}

for(int i=0;i<list2.size();i++){
    Thing thing=(Thing)list2.get(i);
    System.out.println(thing.getName()+" : "+thing.getTotal());
}