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