1

外部ライブラリを使用せずに、Java で以下を実行するためのより良い方法はありますか。

int (プリミティブ) のグループ/子 (ツリーのような) 構造をモデル化する必要があります。Jsonで

[{1,1}, {1,2}, {2,1},{3,1}]

要素の追加/削除 (要素は {group, child} のペア) を重複なくサポートする必要があります。

のようなデータ構造を維持することを考えています。

ArrayList<HashMap<Integer,Integer>>

たす。

ArrayList を反復処理し、挿入する値に対して HashMap キーと値をチェックし、存在しない場合は挿入します。

削除するには:

ArrayList を反復処理し、削除する値に対して HashMap キーと値をチェックし、存在する場合は削除します。

標準ライブラリを使用したより良いデータ構造/アプローチはありますか。


以下の回答の1つに従って、このようなクラスを作成しました。気をつけることを教えてください。KeyValue クラスの equal メソッドを使用して、arraylist が追加/削除を正しく処理することを期待しています (そして試してみます)。ありがとう。

 static class KeyValue {
        int groupPos;
        int childPos;

        KeyValue(int groupPos, int childPos) {
            this.groupPos = groupPos;
            this.childPos = childPos;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            KeyValue keyValue = (KeyValue) o;

            if (childPos != keyValue.childPos) return false;
            if (groupPos != keyValue.groupPos) return false;

            return true;
        }

        @Override
        public int hashCode() {
            int result = groupPos;
            result = 31 * result + childPos;
            return result;
        }
    }
4

5 に答える 5

2

あなたがやろうとしていることを私が理解していれば、これはもっと簡単かもしれません:

TreeMap<Integer,TreeSet<Integer>>
  or
HashMap<Integer,HashSet<Integer>>

だから、ではなく

[{1,1}, {1,2}, {2,1}, {3,1}]

あなたが持っているだろう

[{1, {1, 2}},
 {2, {1}},
 {3, {1}}]

上記の4つのクラスはすべて、重複の排除を自動的に処理することに注意してください。

たす:

TreeMap<Integer, TreeSet<Integer>> map;
TreeSet<Integer> set = map.get(group);
if (set == null) // create it if it doesn't exist
{
  set = new TreeSet<Integer>();
  map.put(group, set);
}
set.add(child);

削除する:

TreeMap<Integer, TreeSet<Integer>> map;
TreeSet<Integer> set = map.get(group);
set.remove(child);
if (set.isEmpty()) // remove it if it is now empty
  map.remove(group);
于 2013-02-07T17:12:21.990 に答える
1

KeyValueグループと子を保持する2つのプロパティを持つ名前のクラスを作成できます。KeyValueオブジェクトをに追加しArrayListます。CRUD操作の場合、KeyValueペアクラスに実装できequalsますcompare

于 2013-02-07T17:15:36.933 に答える
0

の代わりに、インターフェイスを実装する2 つのフィールドでHashMap呼び出されるクラスを使用します。次に、その、およびメソッドを実装/オーバーライドします。次に、必要に応じてまたはを使用して保持します。実装すると、簡単にソートする柔軟性も得られます。Pair{group,child}Comparableequals()hashCode()compareTo()List<Pair>Set<Pair>compareTo()Pairs

于 2013-02-07T17:20:49.077 に答える
0

私はデータ構造の世界は初めてですが、2 つのセット オブジェクトが似ていないという前提に基づいて、これを使用できると思います。

validSet=new HashSet(); を設定します。// ここでジェネリックを使用

HashSet は、追加/削除/格納に一定の時間を提供します

SomeObject{
     Integer parent ;
     Integer child;
     //define equals method based on your requirement
}
于 2013-02-07T17:42:15.263 に答える
0

あなたの質問で行く 私はあなたがこの行を表示したいと思います

[{1,1}, {1,2}, {2,1},{3,1}]

なので

グループ 1-> 1 , 2 (最初の 2 つのペアから)
グループ 2-> 1 (3 番目のペアから)
グループ 3-> 1 (4 番目のペアから)

この階層を格納するのに最も適したデータ構造は次のとおりです。

Map<Integer,Set<Integer>> map = new HashMap<Integer,Set<Integer>>();

keyマップの一部がグループ番号を格納する場所。そして、valueマップの一部はTreeSet、そのグループの子を格納する格納です。
コードの例として:

import java.util.HashMap;
import java.util.ListIterator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
class  TreeLike
{
    public static void main(String[] args) 
    {
        Map<Integer,Set<Integer>> map = new HashMap<Integer,Set<Integer>>();
        int groups[] = {1,2,3,4,5,6,7};
        //To add new group in map
        for (int i = 0 ; i < groups.length; i++)
        {
            Set<Integer> child = new TreeSet<Integer>();
            child.add(1);child.add(2);child.add(3);child.add(4);child.add(5);
            map.put(groups[i],child);
        }
        //To add new child(8) to a group (say group 1)
        Set<Integer> child = map.get(1);
        if (child != null)
        {
            child.add(8);
            map.put(1,child);
        }

        //To remove a child (say child 4) from group 3
        child = map.get(3);
        if (child != null)
        {
            child.remove(4);
            map.put(1,child);
        }
        //To Iterate through all trees
        Set<Map.Entry<Integer,Set<Integer>>> entrySet = map.entrySet();
        Iterator<Map.Entry<Integer,Set<Integer>>> iterator = entrySet.iterator();
        while (iterator.hasNext())
        {
            Map.Entry<Integer,Set<Integer>> entry = iterator.next();
            int group = entry.getKey();
            Set<Integer> children = entry.getValue();
            System.out.println("Group "+group+" children-->"+children);
        }
    }
}
于 2013-02-07T17:56:26.383 に答える