列表中的列表与比较器

时间:2016-09-05 21:39:43

标签: java java-8 comparator

我想在Java 8中用比较器制作一个特定类型的流。

我有2个这样的课程:

public class A {
    private String mName;
    private List<B> mBObjects;

    public A(String name) {
        mBObjects = new ArrayList<>();
        mName = name;
    }

    public void addValue(B b) {
        mBObjects.add(b);
    }

    public List<B> getBObjects() {
        return mBObjects;
    }

    public String getName() {
        return mName;
    }
}

public class B {
    private int mValue;

    public B(int value) {
        mValue = value;
    }

    public int getValue() {
        return mValue;
    }
}

我使用以下代码初始化这些列表:

List<A> listOfA = new ArrayList<>();

//A 1
A a = new A("a1");
a.addValue(new B(20));
a.addValue(new B(12));
listOfA.add(a);

//A 2
a = new A("a2");
a.addValue(new B(3));
listOfA.add(a);


//A 3
a = new A("a1");
a.addValue(new B(2));
a.addValue(new B(26));
a.addValue(new B(6));
listOfA.add(a);

现在我使用以下代码打印列表:

for(A a: listOfA) {
        System.out.print("A: "+a.getName());
        List<B> listOfB = a.getBObjects();
        for(B b:listOfB) {
            System.out.print(" ; notes: "+b.getValue());
        }
        System.out.println(" ");
    }

结果是:

A: a1 ; value: 20 ; value: 12 
A: a2 ; value: 3 
A: a1 ; value: 2 ; value: 26 ; value: 6

我在以下代码后添加此代码:

listOfA = listOfA.stream().sorted(Comparator.comparing(A::getName)).collect(Collectors.toList());

此列表的新结果是:

A: a1 ; value: 20 ; value: 12 
A: a1 ; value: 2 ; value: 26 ; value: 6 
A: a2 ; value: 3

对于每个A对象,我想对列表mBObjects进行排序,而不是使用foreach来获得此结果:

A: a1 ; value: 12 ; value: 20 
A: a1 ; value: 2 ; value: 6 ; value: 26 
A: a2 ; value: 3

感谢&#39; s!

3 个答案:

答案 0 :(得分:3)

如果您想要一种改变原始List的排序,请使用List#sort以避免创建新列表的所有开销。之后,您可以在每个List#sort上致电mBObjects

listOfA.sort(Comparator.comparing(A::getName));
listOfA.forEach(a -> a.getBObjects().sort(Comparator.comparingInt(B::getValue)));

答案 1 :(得分:0)

 for(B b:listOfB) {
     System.out.print(" ; notes: "+b.getValue());
 }

可以改为

listOfB.stream().sorted(Comperator.comparing(B::getValue)).foreach(note -> System.out.print(" ; notes: " + note.getValue());

我认为这应该适合你的问题。

答案 2 :(得分:0)

由于您只想对B中的List<B> mBObjects个对象进行排序,如果您只是将B 可比较并添加,那就太好了它们是TreeSet而不是ArrayList

mBObjects = new TreeSet<B>();

public class B implements Comparable<B>{
    private int mValue;

    //...
    public int compareTo(B b1){
       return this.mValue < b1.mValue? 1 : (this.mValue > b1.mValue? -1:0);
    }
}