2016-09-05 175 views
0

我想做出一個特定的排序我流的比較與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 

對於每一個對象,我想對列表mBObjects進行排序而不作任何foreach以獲得此結果:

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

謝謝!

+0

不清楚你想要做什麼。爲什麼你想避免每個? – shmosel

回答

3

如果您想要改變原始List的排序,請使用List#sort來避免創建新列表的所有開銷。之後,您可以撥打List#sortmBObjects的每一個。

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

爲了簡潔起見,我改變了我的回答,使用'List#sort'而不是'Collections.sort',但它會是一樣的。 – 4castle

+0

非常感謝。 –

+1

這裏你不需要'stream()。forEach(...)'。你可以在'List'上調用'forEach(...)'。 – Holger

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()); 

我想這應該適合你的問題。

+0

等一下,我不明白。你想做什麼? – Cydhra

0

正如你只是希望在List<B> mBObjectsB對象進行排序,這將是很好,如果你只是讓你的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); 
    } 
} 
+0

你應該使用'Integer.compare'。另外,TreeSet不允許重複,並且不會比排序列表更快。 – 4castle