【问题标题】:Java : ArrayList<HashMap<Integer,Integer>>Java : ArrayList<HashMap<Integer,Integer>>
【发布时间】:2013-02-07 17:08:30
【问题描述】:

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

我需要对 int(原始)的组/子(树状)结构进行建模。在 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;
        }
    }

【问题讨论】:

  • 响应编辑 - Set(例如 TreeSet(要求您的类扩展 java.lang.Comparable 或作为输入给出的 Comparator 类)/HashSet)将处理添加/remove 操作比ArrayList 更有效。
  • equals() 代替if (o == null || getClass() != o.getClass()) return false; 使用if(! (o instanceof KeyValue)) return false;

标签: java arraylist hashmap


【解决方案1】:

如果我理解你想要做什么,这可能会更简单:

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

【讨论】:

  • 谢谢。我没有做太多Java,所以从未听说过TreeMap 和TreeSet。会结账。谢谢
  • +1 感谢您的实施。我喜欢这种方法。测试后接受。再次感谢
【解决方案2】:

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

【讨论】:

  • hashCode() 也应该在 equals() 被覆盖时实现。
  • 一个更有效的实现是使用Set&lt;KeyValue&gt;(例如HashSet&lt;KeyValue&gt;TreeSet&lt;KeyValue&gt;)而不是ArrayList&lt;KeyValue&gt;
【解决方案3】:

代替HashMap,使用一个名为Pair 的类,它有两个字段{group,child},它将实现Comparable 接口。然后实现/覆盖其equals()hashCode()compareTo() 方法。然后根据您的需要使用List&lt;Pair&gt;Set&lt;Pair&gt; 来持有它们。实现compareTo() 后,您也可以灵活地轻松对Pairs 进行排序。

【讨论】:

    【解决方案4】:

    我是数据结构领域的新手,但我认为我们可以基于没有两个 Set 对象相似的假设来使用它

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

    HashSet 会为添加/删除/包含提供一个恒定的时间

    SomeObject{
         Integer parent ;
         Integer child;
         //define equals method based on your requirement
    }
    

    【讨论】:

      【解决方案5】:

      按照你的问题,我认为你想显示这一行

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

      作为

      Group 1-> 1 , 2(来自前两对)
      Group 2-> 1(来自 第三对)
      第 3 组-> 1(来自第四对)

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多