Java,Sorting按日期列出不同的类型

时间:2017-04-22 09:20:57

标签: java sorting arraylist

我有三个列表List<A> a;List<B> b;List<C> c;。 类型A,B和C具有日期属性。 如何按日期订购三个列表并按日期打印所有项目,如此示例

        List<A> a = new ArrayList<A>();
        a.add(new A("1", "22/04/2017", "", ""));
        a.add(new A("2", "25/04/2017", "", ""));
        a.add(new A("3", "30/04/2017", "", ""));
        a.add(new A("4", "01/04/2017", "", ""));


        List<B> b = new ArrayList<B>();
        b.add(new B("5", "23/04/2017", "", ""));
        b.add(new B("6", "05/04/2017", "", ""));

        List<C> c = new ArrayList<C>();
        c.add(new C("7", "26/04/2017", "", ""));
        c.add(new C("8", "02/04/2017", "", ""));

输出是:

        4   01/04/2017  --> A
        8   02/04/2017  --> C
        6   05/04/2017  --> B
        1   22/04/2017  --> A
        5   23/04/2017  --> B
        2   25/04/2017  --> A
        7   26/04/2017  --> C
        3   30/04/2017  --> A

4 个答案:

答案 0 :(得分:2)

如果您使用的是Java 8

如果我能理解你的班级设计是这样的:

A类

class A {

    String s1;
    String s2;
    String s3;
    String s4;

    public A(String s1, String s2, String s3, String s4) {
        this.s1 = s1;
        this.s2 = s2;
        this.s3 = s3;
        this.s4 = s4;
    }
    //..getters and setter
}

B类

class B extends A {

    public B(String s1, String s2, String s3, String s4) {
        super(s1, s2, s3, s4);
    }

}

C类

class C extends A {

    public C(String s1, String s2, String s3, String s4) {
        super(s1, s2, s3, s4);
    }
}

在这种情况下,您可以使用:

//Create a List, and add all the a, b, c List to this list
List<A> k = new ArrayList<>();
k.addAll(a);
k.addAll(b);
k.addAll(c);

然后您可以使用Comparator这样的

对此列表进行排序
Collections.sort(k, new Comparator<A>() {
    public int compare(A p1, A p2) {
        return p1.getS2().compareTo(p2.getS2());
    }
});

打印列表

k.forEach((v) -> System.out.println(v.getS2()));

修改

解决方案2

如果您的班级之间没有任何关系,那么您可以使用:

List<String> k = new ArrayList<>();
a.forEach((v)-> k.add(v.s2));
b.forEach((v)-> k.add(v.s2));
c.forEach((v)-> k.add(v.s2));

Collections.sort(k, String::compareTo);

k.forEach((v) -> System.out.println(v));

解决方案3

如果你想走远,你可以:

  1. 创建一个公共类(CommonClass),它采用三个类之间的公共属性
  2. 创建此类型的列表(CommonClass)
  3. 循环抛出此3个列表并创建CommonClass的新对象并将它们添加到新列表
  4. 然后对此最终列表进行排序
  5. 或者:

    解决方案4

    您可以像这样创建List<List<String>>

    List<List<String>> k = new ArrayList<>();
    a.forEach((v) -> k.add(Arrays.asList(v.s1, v.s2, v.s3, v.s4)));
    b.forEach((v) -> k.add(Arrays.asList(v.s1, v.s2, v.s3, v.s4)));
    b.forEach((v) -> k.add(Arrays.asList(v.s1, v.s2, v.s3, v.s4)));
    
    
    Collections.sort(k, (o1, o2) -> {
        return o1.get(1).compareTo(o2.get(1));
    });
    
    k.forEach((v) -> System.out.println(v.get(0) + "____" + v.get(1)));
    

答案 1 :(得分:2)

您可以创建所有项目的流,并使用自定义比较器对其进行排序:

Stream.of(a, b, c).flatMap(List::stream)
        .sorted(Comparator.comparing(o -> {
            if (o instanceof A) return ((A) o).date;
            if (o instanceof B) return ((B) o).date;
            if (o instanceof C) return ((C) o).date;
            throw new RuntimeException("illegal type");
        }))
        .forEach(System.out::println);

答案 2 :(得分:1)

当您说要订购三个不同类型的列表时,您实际上是在说您要创建一个集合并对其进行排序。这意味着(对于Java至少)项目需要具有共同类型。

一旦他们进入一个共同的收藏品,就需要对这些物品做一套共同的事情。在您在问题中给出的示例中,他们唯一可以做的就是转换为字符串,但我希望您最终能够为他们做其他事情。

所以我建议您创建一个接口,其中包含您要在排序列表中执行的方法,然后将该类型的对象添加到列表中:

public interface ABC {
    Date getDate();
}

List<ABC> abcList;

A添加到该列表中将如下所示:

abcList.add(a::getDate);

同样适用于BC

现在对列表进行排序和打印非常简单:

abcList.stream()
    .sorted(Comparator.comparing(ABC::getDate))
    .map(ABC::toString)
    .forEach(System.out::println);

答案 3 :(得分:0)

如果您的类完全不相关,那么除了将所有A,B和C首先组装成Object类型之外别无他法:

List<Object>

然后对它进行排序,提供一个Comparator,它以艰难的方式提取所有需要的值(使用if..else与instanceof级联)。

如果至少不同类的getter方法具有相同的名称(例如第一个字符串的getId(),第二个字符串的getDate()等),则可以通过使用避免使用if的if..else实例内省。