如何根据第二个属性按升序对数组列表进行排序,但升序应该取决于事件?

时间:2014-05-06 16:31:55

标签: java

class helper {
  public int a;
  public int b;
}

主要功能

List<helper> helpers  = new ArrayList<helper>();

假设任何时候帮助者的内容都是

         1     4
         1     5
         1     6
         2     4
         3     4
         2     5

我想按照下面的排序方式输出

         1     6
         1     5
         2     5
         1     4
         2     4
         3     4

这不是第2列的降序排序,而是第2列中出现的升序。像6在第2列中出现一次并且比其他出现少,因此是第1列。然后5发生两次,所以它也比4

3 个答案:

答案 0 :(得分:0)

尝试

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Helper {

    public int a;
    public int b;

    public Helper(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public static void main(String[] args) {
        List<Helper> helpers = new ArrayList<Helper>();

        helpers.add(new Helper(1, 4));
        helpers.add(new Helper(1, 5));
        helpers.add(new Helper(1, 6));
        helpers.add(new Helper(2, 4));
        helpers.add(new Helper(3, 4));
        helpers.add(new Helper(2, 4));

        System.out.println(helpers);

        Collections.sort(helpers,new Comparator<Helper>(){
            public int compare(Helper h1, Helper h2){
              return (countOccurance(h1.b) > countOccurance(h2.b)) ? 1 : -1;
            }

            private int countOccurance(int b) {
                int count = 0;

                for(Helper h : helpers){
                    if(h.b == b) count++;
                }

                return count;
            }});

        System.out.println(helpers);
    }

    @Override
    public String toString() {
        return "Helper [a=" + a + ", b=" + b + "]";
    }

}

答案 1 :(得分:0)

您应该将列中的两个数字存储在HashMap中,其中键是第二列数字,值是您看到该数字的频率。

然后,为了排序,使用Collections.sort,提供比较器。

在compareTo()实现中,查找每个数字的频率并使用它。

答案 2 :(得分:0)

假设您已设置数据和显示记录

        List<helper> helpers = new ArrayList<helper>();
        helpers.add(new helper(1, 4));
    helpers.add(new helper(1, 5));
    helpers.add(new helper(1, 6));
    helpers.add(new helper(2, 4));
    helpers.add(new helper(3, 4));
    helpers.add(new helper(2, 5));

         [1 4, 1 5, 1 6, 2 4, 3 4, 2 5]

创建HashMap以保留Integer,List<helpers>

Map<Integer, List<helper>> holder = new HashMap<Integer, List<helper>>();

根据b值加载HashMap。

for (int i=0;i<helpers.size();i++){
        List<helper> tmp = holder.get(helpers.get(i).getB());
        if (tmp == null){
            tmp = new ArrayList<helper>();
        }
        tmp.add(helpers.get(i));
        holder.put(helpers.get(i).getB(), tmp);
    }

显示地图

{4=[1 4, 2 4, 3 4], 5=[1 5, 2 5], 6=[1 6]}

现在根据元素的大小

开始Map值的升序
List mapValues = new ArrayList(holder.values());
        Collections.sort(mapValues,new helperComparator());
System.out.println(mapValues);

和比较器

class helperComparator implements Comparator<List<helper>>{

    @Override
    public int compare(List<helper> o1, List<helper> o2) {
        return o1.size() > o2.size() ? 1 : -1;
    }

}

最终结果

[[1 6],[1 5,2 5],[1 4,2 4 3,4 4]

注意结果mapValuesList<List<helpers>>。我希望你能帮助他们。