我应该如何按照其中包含的整数对ArrayList进行排序?

时间:2014-03-15 18:17:49

标签: java sorting arraylist

这显然不是我的工作,而是一个例子。 我已经工作了两个多小时,现在使用Comparable,compareTo,compare,Collections,sort等。 这不涉及对附加到它们的字符串进行排序,但是第一个数字应该与它们各自的单词一致。 ArrayList必须保持完整,但我已经用尽所有其他可能性达到我所知道的程度。

    6 Worda
    8 Wordb
    7 Wordc
    20 Wordd
    2 Worde
    5 Wordf
    1 Wordg
    10 Wordh
    1 Wordi
    2 Wordj

新的ArrayList类似于:

    1 Wordi
    1 Wordg
    2 Wordj
    2 Worde
    5 Wordf
    6 Worda
    8 Wordb
    7 Wordc
    10 Wordh
    20 Wordd

3 个答案:

答案 0 :(得分:3)

  1. 创建一个带有字段的类,用于保存每行的信息(此处为int和String),
  2. 使该类与自身可比较。例如,如果该类被称为MyClass,请让它实现Comparable<MyClass>
  3. 给它一个不错的compareTo(...)方法
  4. 在此方法中,您应首先按数字字段排序,如果数字不相等则返回值。
  5. 然后按字符串秒(如果两个数字相等)。

  6. 你说,

      

    这显然不是我的工作,而是一个例子......

    如果您需要更具体的帮助,请考虑发布您的实际代码以及它应该保留的实际数据。


    修改您发布:

    public int compareTo(Team o) { 
       if (this.apps >= o.apps) { 
         return this.apps; 
       } else { 
         return o.apps; 
       } 
    } 
    

    如果可以,请解释一下。


    例如

    // assuming Team has an int field, score and a String field, name
    public int compareTo(Team o) { 
      if (Integer.compare(score, o.score) != 0) {
        // the scores are not the same, so return the comparison
        return Integer.compare(score, o.score)
      } else {
        // the scores are the same, so compare the Strings:
        return name.compareTo(o.name);
      } 
    } 
    

答案 1 :(得分:1)

除了@Hovercraft答案之外,另一种排序方式是。而不是定义自然排序(使用Comparable) 创建自己的排序策略(使用Comparator)。

创建一个包含数据的类

public class MyClass{

private String s;
private Integer id;
public static final Comparator MY_COMPARATOR = new MyComparator();

public MyClass(String s, Integer id){
    this.s=s;
    this.id=id;
}

@Override
public String toString(){
  return "ID :"+id+" property: "+s;
}

//Add getter&setter if you need    

//static nested class
private static class MyComparator implements Comparator<MyClass>{
      @Override
      public int compareTo(MyClass c, MyClass c2){
           //check possible nullPointerException
           int result = c.id.compareTo(c2.id);
           if(result == 0){
              return c.s.compareTo(c2.s);
           }
           return result;
      }

}

}

然后在客户端代码中

List<MyClass> list = new ArrayList<>();
 //add data to the list

 //print it before sort
 System.out.println(list); 
 Collections.sort(list,MyClass.MY_COMPARATOR);
 //print it after sorting
 System.out.println(list);

答案 2 :(得分:0)

从您的示例中可以看出,您希望使用以下规则对每个元素进行排序:

  1. 最低编号
  2. 如果数字相等,则为最高字符串(即排序降序)
  3. 所以你的可比性应该是(像伪代码)

    if (me (number) < other (number) then me is less than
    else if (me (number > other <number the me is greater than
    else if (me (word) > other (word) then me is less than
    else if (me (word) < other (word) then me is greater than
    else me equals other