有没有更好的方法在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;
}
}
答案 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对类中实现equals
和compare
。
答案 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);
}
}
}