我有三个列表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
答案 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
如果你想走远,你可以:
或者:
解决方案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);
同样适用于B
和C
。
现在对列表进行排序和打印非常简单:
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实例内省。