用于对Java集合进行排序的通用比较器(List,Set)

时间:2011-08-02 05:33:34

标签: java generics collections comparator

我需要一些通用比较器,它接受List或Set的实例作为参数,并且命令方向参数(ASC,DESC),然后返回已排序的集合。我似乎无法在互联网上找到这个例子,而且是一个可怕的匆忙。我知道我不会以适当的方式提出问题,因为我没有任何代码可以开始,但我正处于可怕的匆忙之中。集合将包含实现可比较和日期的对象。

非常感谢任何示例,实现。 谢谢。

6 个答案:

答案 0 :(得分:5)

Collections类有一个reverseOrder方法,它返回泛型类型T的比较器,它应满足您对DESC比较器的要求。如果您将Collection传递给Collections.sort()方法,它会自动使用ASC排序。

另外,“排序”对于以“无序”方式维护“唯一”元素的“集合”并不意味着很多(我的意思是你可以使用TreeSet来排序集合,但这是一个不同的故事)。一个简单的解决方法是从List中生成Set并将其传递给Collections.sort

答案 1 :(得分:5)

使用GenericComparator.java,您可以对以下数据类型进行排序:Integer,String,Long,Double,Float和Date。

升序

Collections.sort(persons, new GenericComparator("name", true));

用于降序

Collections.sort(persons, new GenericComparator("name", false));

Detailed information here!

答案 2 :(得分:3)

这可能是一个基本的启动示例,从您的要求开始:

// Create a list
String[] strArray = new String[] {"z", "a", "C"};
List list = Arrays.asList(strArray);

// Sort
Collections.sort(list);
// C, a, z

// Case-insensitive sort
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
// a, C, z

// Reverse-order sort
Collections.sort(list, Collections.reverseOrder());
// z, a, C

// Case-insensitive reverse-order sort
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(list);
// z, C, a

答案 3 :(得分:2)

您必须使用以下代码调用比较器。

Collection.sort(myList,new MyComparatorClass());

然后你必须创建自己的比较器类,它将按升序或降序对你的对象bean进行排序。在那个类中,你可以比较你想要执行sort的属性。我在名字上执行排序

public class MyComparator  implements Comparator {

    public int compare(Object o1, Object o2) {
      return o1.getName().compareTo(o2.getName());
    }

}

答案 4 :(得分:1)

这是我的Java 8通用比较器。你可以比较函数f(T)上的任何T - > R,例如出生日期(R)的人(T)。由于f可以是对T的getter的方法引用,因此很容易在T的任何属性(字段)上进行比较。它适用于null T和null R(您决定空值是首先还是最后),以及提升/降序排列。由于它使用R的自然排序,后者还必须实现Comparable。请参阅代码末尾的用法示例。

public class CompareUtil {

    public static enum Nulls {FIRST, LAST};
    public static enum Order {ASCENDING, DESCENDING};

    /** Return a Comparator of T on a function f(T) -> R */
    public static <T, R extends Comparable<? super R>> Comparator<T> comparatorOf(
            Function<T, R> function,
            Order order,
            Nulls nulls) {

        Comparator<R> rComparator = Comparator.naturalOrder();

        if (order == Order.DESCENDING) {
            rComparator = rComparator.reversed();
        }
        rComparator = (nulls == Nulls.FIRST)? 
                Comparator.nullsFirst(rComparator) :
                    Comparator.nullsLast(rComparator);

        Comparator<T> tComparator = 
                Comparator.comparing(
                        function, rComparator);

        tComparator = (nulls == Nulls.FIRST)? 
                Comparator.nullsFirst(tComparator) :
                    Comparator.nullsLast(tComparator);

        return tComparator;
    }

//Example: construct a comparator that compares Events on event-date
//in descending date order, putting any nulls at the end of the result set
Comparator<Event> c = comparatorOf(Event::getDate, Order.DESCENDING, Nulls.LAST);

答案 5 :(得分:0)

定义Comparator接口 喜欢

public interface Comparator<T> {
  int compare(T o1, T o2);
  boolean equals(Object obj);
}

编写被识别为要比较的类 例如,对于日期对象

public class DateOrderComparator implements Comparator

为Rank Comparator

public class RankCodeComparator implements Comparator

依旧......