按照值对列表进行排序

5

我有一个List<String>和一个List<Integer>,它们都按照特定顺序排列(它们是相互关联的)。List<String>包含名称,List<Integer>包含它们对应的值。

有没有一种方法可以按大小排序List<Integer>,同时改变List<String>的排序方式,使得名称和值仍然保持关联?

5个回答

15
你需要使用 java.util.TreeMap<Integer,String>。该Map会根据其键的自然顺序或在创建Map时提供的Comparator进行排序,具体取决于所使用的构造函数。

1
+1 把属于一起的数据存储在不同的地方是不明智的... 要么为此定义一个类,要么至少将其放入 Map<Integer, String> 中。 - ppeterka
2
有人可以提供一个例子吗? - pedja

14
你应该使用 List<NameAndValue> 代替两个列表(并找到一个更好的名称来反映这些数据实际代表的含义)。Java 是一种面向对象的语言。使用对象是为了包含相关的数据,并通过方法和封装提供行为。
一旦你有了这个类,你就能够按名称、值或两者都对列表进行排序,如果需要添加额外的字段也不会有问题。

2

- 你可以使用 java.util.TreeMap<Integer, String>,它实现了 SortedMap 接口,按照键的自然顺序排序

- 你也可以使用 java.util.Comparator<T> 进行排序。


1
从“清洁代码”的角度来看,如果这些东西“归在一起”,并且这个结构可以在其他地方重复使用,那么你应该将它们创建为一个类,并使其实现Comparable接口:
public SomeClass implements Comparable<SomeClass> {

    private Integer id;
    private String name;

    private Whatever elseIsNeededHere;

    /* getters'n'setters*/

    // ******** THOU SHALT NEVER FORGET THY FRIENDS, EQUALS AND HASHCODE, OR ELSE THEY TURN TO BE THY FOES ********
    @Override
    public boolean equals(Object other) { //do what it takes }

    @Override
    public int hashCode() { //do what it takes! }

    /* actually implement Comparable */
    @Override 
    public int compareTo(SomeClass o) {
        //null check, and other bloat left out for sake of brevity
        return this.id.compareTo(o.getId());
    }

}

然后您可以拥有一个包含属于同一类别的内容的单个列表,并将其进行非常漂亮的排序:

ArrayList<SomeClass> myList = getMyData();
Collections.sort(myList);

而且myList列表实例已按您所需的方式排序。

如果您想要不同的比较方法,可以使用另一种方式,即使用Comparators

Collections.sort(myList,new Comparator<SomeClass>() { 
    public int compare(SomeClass a, SomeClass b) { // do what it takes }
    });

0
你可以尝试这样做:
创建一个自定义的比较器类,例如:
import java.util.Comparator;

/**
 * Created by Maddy Sharma on 7/17/2015.
 * Contains sorting logic to sort Dialogs by its date(long)
 */
public class DateDialogComparator implements Comparator<UserChatDialog>{

// lhs.getLastMessageDateSent() is the long value

    @Override
    public int compare(UserChatDialog lhs, UserChatDialog rhs) {
    // This line will work in java 7 and Android API Level 19
    //    return Long.compare(lhs.getLastMessageDateSent(), rhs.getLastMessageDateSent());


                              'OR'


        if(lhs.getLastMessageDateSent()>rhs.getLastMessageDateSent())
            return -1;
        else if(lhs.getLastMessageDateSent()<rhs.getLastMessageDateSent())
            return +1;
        return 0;
    }
}

在活动或片段中调用它,例如:

ArrayList<UserChatDialog> myList = userChatDialogList;
Collections.sort(myList, new DateDialogComparator());
Log.i("List after sorting is:", "" + userChatDialogList);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接