2016-09-19 8 views
-2

配列の並べ替え方法DashboardObjectAIRオブジェクトの配列arrray 0または1の場所 "UnOk"にcontainsの配列オブジェクトがあると仮定すると、topが表示されます。ソート方法オブジェクトリストの配列javaでは?

以下の場合tempObj "UnOk"が含まれているため、リストのロケーション0にあるairObjをリストする必要があります。

DashboardObjectAIR[] airObj = new DashboardObjectAIR[2]; 

airObj[0] = new DashboardObjectAIR("UnOk"); 

airObj[1] = new DashboardObjectAIR("Ok"); 

airObj1[0] = new DashboardObjectAIR("Ok"); 

airObj1[1] = new DashboardObjectAIR("Ok"); 

List<DashboardObjectAIR[]> tempObj = new ArrayList<DashboardObjectAIR[]>(); 

tempObj.add(airObj); 
tempObj.add(airObj1); 

どのように私はこのscnarionを並べ替えることができます。

誰もが私を助けてくださいことができますか?

+0

DashboardObjectAIR..Basically DashboardObjectAIRの実装を持つことができますか?比較対象を実装する必要がありますか、コンパレータを追加して現在のクラスのDashboardObjectAIRクラスを比較できます。 – Fayaz

+2

あなたはすでに**キーワード**を選んでいます約:*コンパレータ*。そう、あなたはすでにどのトピックを研究するのかを知っています。あなたは本当に私たちにあなたのためにそれをする必要がありますか? – GhostCat

+0

@GhostCat説明してくださいこれを実装する方法は? – Sitansu

答えて

1

試行境界チェック

DashboardObjectAIR[] airObj = new DashboardObjectAIR[2]; 
    airObj[0] = new DashboardObjectAIR("UnOk"); 
    airObj[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj1 = new DashboardObjectAIR[2]; 
    airObj1[0] = new DashboardObjectAIR("Ok"); 
    airObj1[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj3 = new DashboardObjectAIR[2]; 
    airObj3[0] = new DashboardObjectAIR("Ok"); 
    airObj3[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj4 = new DashboardObjectAIR[2]; 
    airObj4[0] = new DashboardObjectAIR("Ok"); 
    airObj4[1] = new DashboardObjectAIR("UnOk"); 

    List<DashboardObjectAIR[]> listOfArray = new ArrayList<DashboardObjectAIR[]>(); 
    listOfArray.add(airObj); 
    listOfArray.add(airObj1); 
    listOfArray.add(airObj3); 
    listOfArray.add(airObj4); 

    Comparator<DashboardObjectAIR[]> c = (a1, a2) -> { 
     int comp = a2[0].getOk().compareTo(a1[0].getOk()); // note a2 - a1 to have Unok before Ok 
     if (comp == 0) 
      return a2[1].getOk().compareTo(a1[1].getOk()); 
     else 
      return comp; 
    }; 
    List<DashboardObjectAIR[]> sorted = listOfArray.stream().sorted(c).collect(Collectors.toList()); 
    sorted.forEach(arr -> System.out.println(Arrays.toString(arr))); 

出力

[DashboardObjectAIR [ok=UnOk], DashboardObjectAIR [ok=Ok]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=UnOk]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]] 

編集-1

を追加する必要がない場合は、最小2つの要素を有することになるアレイを想定

以下未知のサイズの配列[ありがとう簡略化のため@Andreas]

Comparator<DashboardObjectAIR[]> c1 = (a1, a2) -> { 
     return Arrays.stream(a2).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining()) 
       .compareTo(Arrays.stream(a1).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining())); 

    }; 
+0

'Comparator'で' a2'と 'a1'の使用を反転させることで、String * descending *のソート方法を静かに使用しています。見落とすのは簡単なことですが、間違いの可能性があります。そのようなトリックを適用するときは、常に(コメント)文書を書くべきです。少なくとも、あなたは答えで説明したはずです。 – Andreas

+0

@Andreasありがとうございます。コメントを追加します – Saravana

+0

「UnOk」を含む配列を最初に並べ替えることに注意してください。このコードは '[UnOk、Ok]'を '[Ok、UnOk] 'の前にソートします。そうしなければ、元の順序をそのまま残すべきです。 – Andreas

1

、私は、オブジェクトが「UnOk」または「OK」であるか否かを試験するために、DashboardObjectAIRboolean isOk()方法を持っていると仮定する。

目的は、 "UnOk" DashboardObjectAIRオブジェクトを含む配列が最初にソートされるようにList<DashboardObjectAIR[]>をソートすることです。

我々は「UnOk」を目的としているDashboardObjectAIR[]ためfalse値を得ることができますので、もし、それが簡単になります、Boolean.compareTo()種類truefalseという事実を使用することができます。

のJava 8つのストリームを使用して、我々は簡単にこのようことを行うことができます。ここでは

tempObj.sort(Comparator.comparing(a -> Arrays.stream(a).allMatch(DashboardObjectAIR::isOk))); 

は、我々はリストの各要素を調べることによって、リストを並べ替えます。要素はDashboardObjectAIR[]aに割り当てられており、配列のすべてのオブジェクトが「OK」であるかどうかを確認します。その場合はtrue(最後にソート)を返します。それ以外の場合はfalse(ソート先)を返します。

これは任意のサイズのリストと配列に対して機能します。

+0

'anyMatch'をチェックすると思います。配列の中の1つの要素に 'UnOk'が含まれていても、まずは – Saravana

+0

@Saravanaです。なぜなら、* any *' isOk'呼び出しがfalseを返すと、 'false'(ソートファースト)を返すから' allMatch() 'が使われているからです。配列 'isOk'の* all *要素だけがtrueを返し、最後にソートします。 – Andreas

+0

ええ、それを持って、戻り値を反転させる実装は同じでしょうか? – Saravana

関連する問題