2016-11-25 7 views
0
String obtained = transactions.stream() 
    .map(Transaction::getTrader) 
    .map(Trader::getName) 
    .sorted(String::compareTo) 
    .collect(Collectors.joining(",")); 

私が連結された文字列結果は名前で始まるように、特定のComparator<String>を記述せずに返された文字列の自然アルファベット順を逆にしたい場合、私は何をすべき「Z ..」、「Y ..」、 'x ..'など? JavaでストリームAPIを使用してコンパレータの順序を逆にする方法はありますか?

答えて

2

、このようなものは、トリックを行うことができます:文字列は、Comparableインタフェースを実装しているため、それが動作

String obtained = transactions.stream() 
        .map(Transaction::getTrader).map(Trader::getName) 
        .sorted(Comparator.reverseOrder()) 
        .collect(Collectors.joining(",")); 

注意を。

+0

! Thx、TDRS –

+0

'Collection'の代わりに' Comparator.reverseOrder() 'を意味すると思います。 – 4castle

2

逆の順序でコレクションを並べ替えるのに必要な操作は1つだけです。

String implements Comparable interface。 java.lang.Comparableと#のcompareTo(用javadocは、それが返すことを言う:

負の整数、ゼロ、または正の整数、このオブジェクト に等しい、より小さい、またはより大きいとして

  1. [推奨] Uを:指定されたオブジェクト

をすることができますコレクションの順序を逆にするにはSE

が 指定されたコンパレータの逆順を義務付けるコンパレータを返しComparator.reverseOrderjavadoc)。比較パラメータ

reversedOrderedStrings = strings.stream() 
          .sorted((s1, s2) -> s2.compareTo(s1)) 
          .collect(Collectors.joining(",")); 
  • の(...)

  • List<String> strings = Arrays.asList("a","b","d", "c", "e"); reversedOrderedStrings = strings.stream() .sorted(Comparator.reverseOrder()) .collect(Collectors.joining(",")); 
  • 反転順序[推奨されていない]のcompareTo()メソッドの符号を変更。これは、すべてが同じであるため、それははInteger.MIN_VALUE

    reversedOrderedStrings = strings.stream() 
              .sorted((s1, s2) -> -s1.compareTo(s2)) 
              .collect(Collectors.joining(",")); 
    
  • 出力のための数値オーバーフローを引き起こす可能性がありますようお勧めしません:私は期待していたものです

    System.out.println(reversedOrderedStrings); 
    e,d,c,b,a 
    
    +1

    あなたは正しいですが、あなた自身のコンパレータを書かないという質問があります。私はあなたの方法がより速く、使用されなければならないことを認めます。 –

    +0

    はい、私はそれを行うことができます、私はCollection.reverseOrder()メソッドを探していた。 –

    +0

    [逆コンパイラのJava 8]で説明されているように、私の答えでソート(Comparator.reverseOrder())を使用しているはずです(http://stackoverflow.com/questions/32995559/reverse-a-comparator-in- java-8)。 – gr7

    関連する問題