使用Comparator对Arraylist进行排序

时间:2017-04-02 06:08:09

标签: java collections comparator

打印输出为{first max,first min,second max,second min,third max,third min等等.....}

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

  import compl.compl;

  public class Arraylist1 {


public static void main(String args[]){

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

 list.add(20);
 list.add(30);
 list.add(70);
 list.add(50);
 list.add(60);
 list.add(40);

  Comparator<Integer> cmp=new Comparator<Integer>() {

    @Override
    public int compare(Integer o1, Integer o2) {
        // TODO Auto-generated method stub
        int pos=0;
        if(pos%2==0){
            if(o1<o2){
                return 1; 
            }
            }
           if(pos%2!=0){
            if(o1>o2){
                return -1; 
            }
            }
            pos++;  
        }
    }
};

Collections.sort(list, cmp);
for(int i=0;i<list.size();i++){
    System.out.println(list);
}


 }
}

收到错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    This method must return a result of type int

    at Arraylist1$1.compare(Arraylist1.java:51)
    at Arraylist1$1.compare(Arraylist1.java:1)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324)
    at java.util.TimSort.sort(TimSort.java:189)
    at java.util.TimSort.sort(TimSort.java:173)
    at java.util.Arrays.sort(Arrays.java:659)
    at java.util.Collections.sort(Collections.java:217)
    at Arraylist1.main(Arraylist1.java:67)

我没有明白为什么我会收到此错误,我想这会导致隔离专区需要返回类型,但在我的情况下,这里不能指定返回类型。

3 个答案:

答案 0 :(得分:1)

您的代码无法遵守。为此,你在所有情况下都有比较器的返回值。

 if (pos % 2 == 0) {
      if (o1 < o2) {
           return 1;
      } else if (o1 > o2) {
           return -1;
      } 
      pos++;
      TODO: defie return value here
} else { TODO: define return value here }

重要提示:您的变量pos将始终为0.因为它是方法变量,并且每次调用方法时都会创建它。如果只需要实时订购,可以将比较器定义为(按降序排列)

return o2.compareTo(o1);

按升序排列

return o1.compareTo(o2);

答案 1 :(得分:0)

您的错误与比较器/集合无关,甚至与Java无关。 在编程中,函数必须返回任何输入的返回值。

对于compare

的情况,您的pos%2 != 0函数不会返回任何内容

答案 2 :(得分:0)

自定义比较器cmp刚刚被分配了按降序对list进行排序的任务

Comparator<Integer> cmp = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        if (o1 < o2) {
            return 1;
        } else {
            return -1;
        }
    }
};

Collections.sort(list, cmp);
  

输出:70 60 50 40 30 20

然后调用方法modifyList以满足最大和最小要求。在此,我创建了另一个List<Integer>,它将从上面的输出列表中选择元素并以1st max, 1st min, 2nd max, 2nd min ... so on...顺序

分配它们
public static List<Integer> modifyList(List<Integer> list) {
    List<Integer> result = new ArrayList<>(list.size());

    int i = 0, j = list.size() - 1;
    int r = 0;
    while (r < list.size()) {
        result.add(r++, list.get(i++));
        if (i < j)
            result.add(r++, list.get(j--));
    }

    return result;
}

只需将元素从正面和背面填充到结果列表中即可。

Complete program code here

  

最终输出

enter image description here