【发布时间】:2019-06-26 03:44:07
【问题描述】:
我正在尝试在 Java(或 Groovy)中找到这样的数据结构:
MemberAdressableSetsSet mass = new MemberAdressableSetsSet();
mass.addSet(["a","b"]);
mass.addSet(["c","d","e"]);
mass.get("d").add("f");
String output = Arrays.toString(mass.get("e").toArray());
System.out.println(output); // [ "c", "d", "e", "f" ] (ordering irrelevant)
这样的东西存在吗?如果没有,有没有办法用普通的 Java 代码实现这样的东西,不会给 CPU 或内存带来数周的噩梦?
编辑:更严格
MemberAdressableSetsSet mass = new MemberAdressableSetsSet();
Set<String> s1 = new HashSet<String>();
s1.add("a");
Set<String> s2 = new HashSet<String>();
s2.add("c");s2.add("d");s2.add("e");
mass.addSet(s1);
mass.addSet(s2);
Set<String> s3 = new HashSet<String>();
s3.add("a");s3.add("z");
mass.addSet(s3);
/* s3 contains "a", which is already in a subset of mass, so:
* Either
* - does nothing and returns false or throws Exception
* - deletes "a" from its previous subset before adding s3
* => possibly returns the old subset
* => deletes the old subset if that leaves it empty
* => maybe requires an optional parameter to be set
* - removes "a" from the new subset before adding it
* => possibly returns the new subset that was actually added
* => does not add the new subset if purging it of overlap leaves it empty
* => maybe requires an optional parameter to be set
* - merges all sets that would end up overlapping
* - adds it with no overlap checks, but get("a") returns an array of all sets containing it
*/
mass.get("d").add("f");
String output = Arrays.toString(mass.get("e").toArray());
System.out.println(output); // [ "c", "d", "e", "f" ] (ordering irrelevant)
mass.get("d") 将返回包含"d" 的mass 中的Set<T>。类似于 get() 在 HashMap 中的工作方式:
HashMap<String,LinkedList<Integer>> map = new HashMap<>();
LinkedList<Integer> list = new LinkedList<>();
list.add(9);
map.put("d",list);
map.get("d").add(4);
map.get("d"); // returns a LinkedList with contents [9,4]
【问题讨论】:
-
您的问题不清楚。
get("d")到底是什么意思?如果get("d")在多个集合中,如果"d"在多个集合中,会发生什么?您是否希望能够做这样的事情:set s = ["a","b"]; mass.addSet(set); s.add(...);并且还更新了质量集?["a", "b"]的具体类型是什么?它不是有效的 Java 语法。 -
另外,
get(..)返回什么类型? (它需要吗?)根据各种操作addSet、get、add和您需要的任何其他操作的复杂性,说明您可接受的最低要求。 (换句话说,用更严格的语言告诉我们“CPU 或内存噩梦”是什么意思。) -
@StephenC 更好吗?
-
您没有回答有关复杂性的问题。