2016-05-10 5 views
1

私は学校プロジェクトをやっているので、使用量(降順)で配列を印刷する必要があります。問題は、5つの配列を1つに結合し、forループの内部に情報を集める必要があるため、コード内で配列を宣言しなければならないということです。2d文字列を列で並べ替え

だから私のコードは次のようなものです:

       ⇩ 

        Entry | Amount | Category  | Payment | Date 

String array[][]={ {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
        {"1", "44,4", "shop", "cash", "16/02/2017"}, 
        {"2", "33,1", "shop", "cash", "15/01/2020"}, 
        {"3", "17,3", "gym", "visa", "10/01/2016"}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, 
        {null, null, null, null, null}, }; 

だから私はComparatorを使用してArrays.sort()を使用してみましたが、私は、私は常に取得java.lang.NullPointerException内のこれらのヌルを得たので、私は右のそれを得るように見えることはできません。

私が試したことはこれです:

Arrays.sort(array, (String[] o1, String[] o2) -> Float.compare(Float.parseFloat(o2[1]), 
         Float.parseFloat(o1[1]))); 

そして、何私が取得しようとしていることである:

   {"1", "44,4", "shop", "cash", "16/02/2017"}, 
       {"2", "33,1", "shop", "cash", "15/01/2020"}, 
       {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
       {"3", "17,3", "gym", "visa", "10/01/2016"}}; 

すべてのヘルプは非常にいただければ幸いです。ありがとうございました!

+1

私は問題を賭けはあなたのコンパレータのコードです。たとえば、 'Entry'で配列をソートしている場合は、常にヌル以外のものの後ろに来るエントリ' null'を選択することができます。 –

+0

ご理解いただけないことをお詫び申し上げます。私はその質問を編集しました。 –

+0

また、無効であると思われる文字列配列は常に_filter_できます。そうすることで、(並べ替えで)気にするフィールドにnull以外の値が設定されます。 –

答えて

1

私は、次のコードは、合理的にうまく機能信じる:

public class StringArraySorter { 
    public static void main(String[] args) { 
     String array[][]={ {"5", "22,2", "car payment", "visa", "21/04/2016"}, 
       {"1", "44,4", "shop", "cash", "16/02/2017"}, 
       {"2", "33,1", "shop", "cash", "15/01/2020"}, 
       {"3", "17,3", "gym", "visa", "10/01/2016"}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
       {null, null, null, null, null}, 
     }; 

     Arrays.sort(array, new Comparator<String[]>() { 
      @Override 
      public int compare(String[] o1, String[] o2) { 
       String a1 = o1[1]; // amount field 
       String a2 = o2[1]; // amount field 
       if (a1 != null && a2 != null) { 
        a1 = a1.replace(',', '.'); 
        a2 = a2.replace(',', '.'); 
        return Float.compare(Float.parseFloat(a2), Float.parseFloat(a1)); 
       } 
       return 1; // non-null value for amount takes precedence, whatever that may be 
      } 
     }); 
     System.out.println(Arrays.deepToString(array)); 
    } 
} 

それ印刷します(改行を挿入するように変更された)あなたの要件に近いいる:あなたは常にプルーンできた、今

[[1, 44,4, shop, cash, 16/02/2017], 
[2, 33,1, shop, cash, 15/01/2020], 
[5, 22,2, car payment, visa, 21/04/2016], 
[3, 17,3, gym, visa, 10/01/2016], 
[null, null, null, null, null], 
[null, null, null, null, null], 
[null, null, null, null, null], 
[null, null, null, null, null]] 

Arrays.sortメソッドに配列を送信する前に、特定のキーフィールドnull(または他の方法では無効)を持つレコード(文字列配列)を削除するために入力配列を使用します。 Javaの8構築物を用いて(しかし、間違いなく、不可解なビット)になることで、初期の試み:

Arrays.stream(array).filter(a -> a[2] != null) 
      .sorted((o1, o2) -> Float.compare(Float.parseFloat(o1[1].replace(',', '.')), Float.parseFloat(o1[1].replace(',', '.')))) 
      .forEach(a -> System.out.println("{" + Arrays.stream(a).map(s -> "\"" + s + "\"").collect(Collectors.joining(", ")) + 
      "}")); 

プリント:

{"1", "44,4", "shop", "cash", "16/02/2017"} 
{"2", "33,1", "shop", "cash", "15/01/2020"} 
{"5", "22,2", "car payment", "visa", "21/04/2016"} 
{"3", "17,3", "gym", "visa", "10/01/2016"} 
+0

それsmoooooothを動作させる! しかし、私はそれをどのようにフォーマットできますか? printfを使うことはできますか?それともそれぞれを使うべきですか? –

+0

あなたのコードでは、 'null'をチェックしません! –

+0

ええ、それをあなたが望むように印刷するために、おそらくあなたは配列を繰り返し処理し、あなたのカスタム_文字列_を使うことができます。 –

関連する問題