2017-09-04 17 views
1

今、私は "ドラゴン"の配列を持っています。各項目には2つの値があります。 IDとカウントだから、私の配列は次のようになります:オブジェクトの配列内のオブジェクトの重複値をチェックし、重複値をマージして重複を削除するにはどうすればよいですか?

Dragon[] dragons = { new Dragon(2, 4), 
        new Dragon(83, 199), 
        new Dragon(492, 239), 
        new Dragon(2, 93), 
        new Dragon(24, 5) 
        }; 

私が見る通り、IDが2の2つのドラゴンが配列にあります。私が達成したいのは、重複が見つかった場合、重複のカウントを最初のカウントに追加してから重複したDragonを削除することです。

ソートが正常に終了しましたが、配列の途中でnullになり、nullを取り除きシャッフルする方法がわかりません。

これは私がこれまで持っているものですが、それが本当に正常に動作しません:

public static void dupeCheck(Dragon[] dragons) { 
    int end = dragons.length; 
    for (int i = 0; i < end; i++) { 
     for (int j = i + 1; j < end; j++) { 
      if (dragons[i] != null && dragons[j] != null) { 
       if (dragons[i].getId() == dragons[j].getId()) {     
        dragons[i] = new Item(dragons[i].getId(), dragons[i].getCount() + dragons[j].getCount()); 
        dragons[j] = null; 
        end--; 
        j--; 
       } 
      } 
     } 
    } 
} 
+1

あなたはこれまで何を得ていますか?簡単な方法は、リストを作成し、あなたの配列を反復し、IDが存在するかどうかチェックし、そうでなければcountを加算するか、そうでなければオブジェクトを追加することです – Stultuske

+3

これは、 'Dragon'オブジェクトがidとpopulation countの両方を持つことを意味します。私の設計上の欠陥のように聞こえます... – fge

+1

配列の代わりにArrayListを使うのはどうですか? 'remove'は彼がやろうとしたものではないので、 – Tschallacka

答えて

2

ドラゴンクラス自体の各ドラゴンのドラゴン数を維持しない方がよいでしょう。

それを除いて、あなたが配列を使用することを余儀なくされたとしても、あなたのドラゴンを格納するための中間的なマップを作成する必要があります。

Map<Integer, Dragon> idToDragon = new HashMap<>(); 
for (Dragon d : yourArray) { 
    // fetch existing dragon with that id or create one if none present 
    Dragon t = idToDragon.computeIfAbsent(d.getId(), i -> new Dragon(i, 0)); 
    // add counts 
    t.setCount(t.getCount() + d.getCount()); 
    // store in map 
    idToDragon.put(d.getId(), t); 
} 

このマップには、ドラゴンズのIDとドラゴンの間に正しいカウントが含まれています。 はあなただけ

Dragon[] newArray = idToDragon.values().toArray(new Dragon[idToDragon.size()]); 
+0

すばらしい。これは美しく働いた、ありがとう! – David

0

あなたは配列に結果を格納するために力かもしれないが、それはあなたが力だという意味ではありません常にを使用する

解決策の1つは、Stream APIを使用して、項目をグループ化して、配列に再度保存することです。 API Streamを使用して値の合計をhereにする方法の例を得ることができます。 List<T>T[]に変換するのはかなり簡単ですが、とにかく例がありますhere

0

サイズ配列のすることができ、それが作成後に変更することはできません、このマップの外に配列を作成します。

したがって、マージされたドラゴンを含む新しい配列またはリストを返す必要があります。

public static Dragon[] merge(Dragon[] dragonArr) { 
    return Arrays.stream(dragonArr) 
      // 1. obtain a map of dragon IDs and their combined counts 
      .collect(groupingBy(Dragon::getId, summingInt(Dragon::getCount))) 
      // 2. transform the map entries to dragons 
      .entrySet().stream().map(entry -> new Dragon(entry.getKey(), entry.getValue())) 
      // 3. collect the result as an array 
      .toArray(Dragon[]::new); 
} 
関連する問題