1

arrayLists の arrayList があります。各内部配列リストには、形式 (name.version) のいくつかのオブジェクトが含まれています。

{  {a.1,b.2,c.3} , {a.2,d.1,e.1} , {b.3,f.1,z.1}....} 

たとえば、a.1 は名前 = a でバージョンが 1 であることを意味します。

したがって、このリストの配列リストで重複を排除したいと考えています。私にとって、2 つのオブジェクトが同じ名前を持つ場合、それらは重複しています。

したがって、基本的に私の出力は

{ { a.1,b.2,c.3},{d.1,e.1} ,{f.1 ,z.1} }

出力をまったく同じ形式にしたいことに注意してください(つまり、重複のない単一のリストは必要ありません)

誰かがこれに最適なソリューションを提供できますか?

各内部リストをループして、内容をハッシュセットに配置できます。しかし、そこに 2 つの問題があります。リストのリストの形式で答えを返すことができません。これらのオブジェクトは、名前が同じであれば、意味のある意味で同等です (この場合のみ。スペクトル全体をカバーするかどうかはわかりません)。

ありがとう

4

3 に答える 3

3

Iterator.remove() を使用して、コレクションを移動しながらコレクションを変更しました。

// build your example input as ArrayList<ArrayList<String>>
String[][] tmp = { { "a.1", "b.2", "c.3" }, { "a.2", "d.1", "e.1" },
        { "b.3", "f.1", "z.1" } };
List<List<String>> test = new ArrayList<List<String>>();
for (String[] array : tmp) {
    test.add(new ArrayList<String>(Arrays.asList(array)));
}

// keep track of elements we've already seen
Set<String> nameCache = new HashSet<String>();

// iterate and remove if seen before
for (List<String> list : test) {
    for (Iterator<String> it = list.iterator(); it.hasNext();) {
        String element = it.next();
        String name = element.split("\\.")[0];
        if (nameCache.contains(name)) {
            it.remove();
        } else {
            nameCache.add(name);
        }
    }
}
System.out.println(test);

出力

[[a.1, b.2, c.3], [d.1, e.1], [f.1, z.1]]
于 2012-05-05T00:08:25.903 に答える
2
List<List<Pair>> inputs; // in whatever format you have them
List<List<Pair>> uniqued = new ArrayList<>(); // output to here
Set<String> seen = new HashSet<String>();
for (List<Pair> list : inputs) {
  List<Pair> output = new ArrayList<>();
  for (Pair p : list)
    if (seen.add(p.getName()))
      output.add(p);
  uniqued.add(output);
}
于 2012-05-05T00:03:03.623 に答える
1

セットを作成します。リストのアイテムのリストを反復処理します。アイテムがセット内にあるかどうかを確認します。既に存在する場合は、無視してください。そうでない場合は、セットとリストのリストに追加します。

メソッドは、古いリストを変更するのではなく、リストの新しいリストを返します。リストを反復しながらリストを変更するのは面倒です。

于 2012-05-05T00:03:36.267 に答える