コンパレータを使用して、最初にタイプ別にソートしてから、名前で並べ替えます。
java.util.Collections.sort(list, (a,b)->
a.type != b.type ? a.type - b.type : a.name.compareTo(b.name);)
実際にはあなたが望むものであると仮定して動作するはずです。 String
は
となります。
これは辞書順の定義です。 2つの文字列がそれぞれ である場合、両方の文字列の有効なインデックスである のインデックスが異なるか、またはその長さが 異なっているか、またはその両方です。 1つまたは複数のインデックス位置に異なる文字がある場合は、kをそのようなインデックスの最小値にします。文字列 は、 オペレータを使用して決定されるように、位置kの文字がより小さい値を有し、他の文字列を辞書的に先行する。 この場合、のcompareToは 値が2つの文字列内の位置kで2つの文字の違いを返す - つまり、値:
this.charAt(k)-anotherString.charAt(k)
彼らが異なるのNO指標 位置が存在しない場合短い文字列 は、長い文字列に辞書的に先行します。この場合、のcompareTo は、文字列の長さの差を返す - つまり、 値:ドキュメントから
this.length()-anotherString.length()
いません。正確に1,0、-1を返すcompareToに頼らないでください。代わりに+、0、 - を覚えておいてください。たとえば、長さの差が1で、型の違いが-1の場合、コンパレータは間違っています。
コンパレータ –
を使用して、私はあなたが 'type'が代わりのマジックナンバーのために列挙型を使用することをお勧め。 – khelwood
コンパレータの実装を提供できますか?私はこれを試した: java.util.Collections.sort(リスト、(a、b) - > a.name.compareTo(b.name)+(a.type-b.type) ); –