首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有Comparator<List<T>>或Comparator<Collection<T>>吗?

有Comparator<List<T>>或Comparator<Collection<T>>吗?
EN

Stack Overflow用户
提问于 2014-08-28 12:15:00
回答 2查看 222关注 0票数 2

我正在搜索一个实现以下内容之一的类

代码语言:javascript
复制
java.util.Comparator<int[]>
java.util.Comparator<List<T>>
java.util.Comparator<Collection<T>>

为什么在/ApacheCommon/ Google中没有这样的类?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 14:34:37

番石榴的Ordering类提供了Iterable的字典顺序,它使用一个基本的Ordering来比较每一对元素。

代码语言:javascript
复制
Ordering<T> elementOrdering = ...
Ordering<Iterable<T>> lexicographical = elementOrdering.lexicographical();
票数 2
EN

Stack Overflow用户

发布于 2014-08-28 12:43:44

有一个ComparatorChain,它可能是您要寻找的。

但是,实现词典编纂比较器也不是那么难:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class LexicographicalComparatorsTest
{
    public static void main(String[] args)
    {
        List<List<String>> lists = new ArrayList<List<String>>();
        lists.add(Arrays.asList("A", "B", "4"));
        lists.add(Arrays.asList("A", "B", "1"));
        lists.add(Arrays.asList("A", "B", "3"));
        lists.add(Arrays.asList("A", "B", "2"));
        lists.add(Arrays.asList("A", "A", "9"));
        lists.add(Arrays.asList("A", "C", "0"));

        Comparator<String> c = comparableComparator();
        Comparator<List<String>> cc = createCompatator(c);

        Collections.sort(lists, cc);
        for (List<String> list : lists)
        {
            System.out.println(list);
        }
    }

    private static <T extends Comparable<T>> Comparator<T> comparableComparator()
    {
        return new Comparator<T>()
        {
            @Override
            public int compare(T t0, T t1)
            {
                return t0.compareTo(t1);
            }
        };
    }

    public static <T> Comparator<List<T>> createCompatator(
        final Comparator<T> comparator)
    {
        return new Comparator<List<T>>()
        {
            @Override
            public int compare(List<T> list0, List<T> list1)
            {
                int n = Math.min(list0.size(), list1.size());
                for (int i=0; i<n; i++)
                {
                    T t0 = list0.get(i);
                    T t1 = list1.get(i);
                    int result = comparator.compare(t0, t1);
                    if (result != 0)
                    {
                        return result;
                    }
                }
                return 0;
            }
        };
    }
}

通过倒转列表遍历方向,可以实现字典比较器。

本例中的比较器也可以推广到Comparator<Collection<T>>,方法是使用手动遍历和从集合中获得的两个Iterator<T>实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25548594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档