Java:ArrayList <hashmap <integer,integer>&gt; </hashmap <integer,integer>

时间:2013-02-07 17:08:30

标签: java arraylist hashmap

有没有更好的方法在Java中执行以下操作,而不使用外部库。

我需要模拟int(primitive)的group / child(tree like)结构。在Json

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

我需要支持添加/删除元素(元素是一对{group,child})而不重复。

我在想,保持像。的数据结构。

ArrayList<HashMap<Integer,Integer>>

添加。

通过ArrayList迭代,检查HashMap键和值以插入值,如果不存在则插入。

要删除:

遍历ArrayList,根据要删除的值检查HashMap键和值,如果存在则删除。

标准库是否有更好的数据结构/方法。


根据下面的答案之一,我做了一个这样的课程。 请让我知道任何要注意的事项。我期待(并试图)arraylist将通过使用KeyValue类中的equal方法正确处理添加/删除。感谢。

 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;
        }
    }

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您可以编写一个名为KeyValue的类,其中包含两个用于保存组和子项的属性。将KeyValue个对象添加到ArrayList。对于CRUD操作,您可以在KeyValue对类中实现equalscompare

答案 2 :(得分:0)

而不是HashMap,使用名为Pair的类,其中两个字段{group,child}将实现Comparable接口。然后实现/覆盖其equals()hashCode()compareTo()方法。然后根据您的需要使用List<Pair>Set<Pair>来持有它们。实施compareTo()后,您可以轻松地轻松排序Pairs

答案 3 :(得分:0)

我是数据结构世界的新手,但我认为我们可以基于假设没有两个Set Objects会相似来使用它

设置validSet = new HashSet(); //在这里使用泛型

HashSet将为添加/删除/包含

提供一个固定的时间
SomeObject{
     Integer parent ;
     Integer child;
     //define equals method based on your requirement
}

答案 4 :(得分:0)

继续你的问题我认为你想要显示这一行

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

as

  

组1-&gt; 1,2(从前两对)第2组&gt; 1(从   第三对)
组3-> 1(来自第四对)

最适合存储此层次结构的数据结构是:

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);
        }
    }
}