2017-05-21 3 views
3

2つのリストのデータを3番目のリストにマッピングするのが難しいです。私のサンプルデータは次の通りです:2つの配列からのJavaマッピングデータと3番目の配列への挿入

Categorylist ID: 1,2,3,4,5,6,7,8,9,10,42,46,49,50 
CurrentMonthByCat ID: 1,2,3,4,5,6,7,8,9,10,42,49,50 
(the transaction amount value for CurrentMonthByCat: 92,46,40,180,60,10,1510,200,500,10,234,12) 

currentMonthByCatには46がありません。 currentMonthByCat IDがカテゴライズIDから存在しない場合、CurrentMonthByCatからトランザクション量を取得して3番目のリストにプッシュするのではなく、3番目のリストに0を挿入するような方法で処理しようとしています。

ArrayList<Double> total = new ArrayList<Double>(); 

    for(int i = 0; i < categorylist.size(); i++){ 
     for(int j = 0; j < currentMonthByCat.size(); j++){ 
      if(categorylist.get(i).getCategoryID().equals(currentMonthByCat.get(j).getCategory().getCategoryID())){ 
       Log.d("IIIII", categorylist.get(i).getCategoryID()); 
       Log.d("JJJJJ", currentMonthByCat.get(j).getCategory().getCategoryID()); 
       total.add((double)currentMonthByCat.get(j).getTransactionAmt()); 
      }else{ 
       total.add(0.0); 
      } 
     } 
    } 

    for(int k = 0; k < total.size(); k++){ 
     Log.d("KKKKK", String.valueOf(total.get(k))); 
    } 

しかし、全リストのプリントアウト結果は次のとおりです。私が期待したもの

92,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0... 

は次のとおりです。

92,46,40,180,60,10,1510,200,500,10,0,234,12 

私はcurrentMonthByCatでIDが一致しない場合にのみ、0を挿入したいですカテゴリ内のID。例えば、右から3番目のID 46。

第3の配列に最初に92を挿入した後、カテゴライズIDが1のままであるため、ID2に移動する前にcurrentMonthByCatの残りすべてと比較します。そのため、不要なゼロ。しかし、私が望んだものを達成するためにそれを実際にどのようにソートするのかは分かりません。

アイデア?

ありがとうございます。

答えて

0

これは簡単です。内側のループが終了しない限り、配列全体でゼロまたは値を加算することはできません。おそらく要素existsAtIndexを追加し、-1でループを初期化し、要素を見つけたらexistsAtIndexにインデックスを割り当ててループを中断します。存在しない場合はゼロを追加します。基本的なループを使用する代わりに、ArrayListの中に存在していないかどうかを使用することができ、コードがアイテムをチェックする方法が含まれ、より良いため

ArrayList<Double> total = new ArrayList<Double>(); 
int existAtIndex; 
    for(int i = 0; i < categorylist.size(); i++){ 
     // search for the element index 
     existAtIndex = -1; 
     for(int j = 0; j < currentMonthByCat.size(); j++){ 
      if(categorylist.get(i).getCategoryID().equals(currentMonthByCat.get(j).getCategory().getCategoryID())){ 

       existAtIndex = j; 
       break; 
      } 
     } 

     // add the value in the element index or add zero if the element not exist 
     if (existAtIndex != -1) { 
      total.add((double)currentMonthByCat.get(existAtIndex).getTransactionAmt()); 
     } 
     else { 
      total.add(0.0); 
     } 
    } 

    for(int k = 0; k < total.size(); k++){ 
     Log.d(String.valueOf(total.get(k))); 
    } 

:ので、コードは次のようになります。幸運

+0

しかし、このコードは正しく、ID 46で3番目の最後の位置はcurrentMonthByCatには存在しません.0よりも3番目の配列に2の位置の前に値が挿入されています。 existAtIndexを-1のelseループの中に入れてください – guest176969

+0

私はそれが望むようにゼロを挿入すると思います。ループの後のif条件は、存在する場合に要素の位置を追加するか、またはゼロを追加することを意味します。 –

+0

私は、ifAuthIndexを、最初のif文の-1の下に-1に設定しなければならないと思います。私はそれを設定し、私が望んだものを達成しました。さもなければ、それは以前の値をとり、それがなぜ私には分からないのかを設定します。助けてくれてありがとう! :) – guest176969

1

その後Categorylist IDの値を使用してマップをトラバースMap<Integer, Double>

Map<Integer, Double> map = new HashMap<Integer, Double>(); 
for (int i = 0; i < currentMonthByCat.size(); ++i) { 
    //... categoryId = currentMonthByCat.get(i).categoryId 
    //... amount = currentMonthByCat.get(i).amount 
    map.put(categoryId, amount); 
} 

に自分の価値観を置く:

// create result arraylist 
ArrayList<Double> total = new ArrayList<Double>(); 
for (int i = 0; i < categorylist.size(); ++i) { 
    Double amount = map.get(categorylist.get(i)); 
    if (amount == null) { 
     total.add(0.0); 
    } else { 
     total.add(amount); 
    } 
} 

結果リストtotalが存在しないため、既存のマッピングの量、またはゼロを含みます。

その他の方法 ことが保証されている場合は、他のリストにインデックス/カーソルを維持し、最初から他のリストを反復されていないが、あなたはその後、リストの1を横切ることができるcategorylistがソートされ、CurrentMonthByCatが

をソートします以前に記憶されたカーソル値から、n^2より平均的なパフォーマンスが向上します

+0

私は、このような地図<文字列、ダブル>マップ= nullのようなマップを初期化します。私はNULLオブジェクトの参照エラーメッセージ – guest176969

+0

@EmmaHannahを編集することはできません、マップの初期化を追加しました。 –

+0

助けてくれてありがとう!しかし、どういうわけか、それは全部ゼロになるように合計を設定しました。私はそれがなぜそうであるか分かりません。 – guest176969

1

あなたはここで何をしようとしているのかについて多くのコードを持っています。私は次のスニペットが、あなたが非常に読みやすく保守しやすい方法でしたいことをしていると思います。

//First of all we are interested in getting a transaction amount for each value in currentMonthByCat 
    //so loop around using your object (not sure what it's called) 
    for(CurrentMonth value : currentMonthByCat){ 
     //check if it's present. 
     //We create a new method here that gets you your category list as a list of integers. 
     //This is key to making the whole method much more readable. 
     if(categorylist.getIdsAsList().contains(value.getCategory().getCategoryID())){ 
      //it is so add it 
      total.add(value.getTransactionAmt()); 
     } else { 
      //it's not so add a 0 
      total.add(0.0); 
     } 
    } 

getIdsAsList方法は、次のようになります。

public List<Integer> getIdsAsList(){ 
    List<Integer> result = new ArrayList<>(); 
    for (CategoryListItem item : categorylist) { 
     result.add(item.getCategoryId()); 
    } 
    return result; 
} 
+0

助けてくれてありがとう! – guest176969

関連する問題