我有一个地图,其值是一个集合.给定一个键,我想删除该集合的一个元素并将其返回,但如果该集合为空,我还想删除该条目.有没有办法使用Java 8的众多新Map方法之一以简短的方式完成此操作?
一个简单的例子(我使用Stack但它可以是List,Set等).为了示例,我们假设已经检查了地图包含密钥.
public static String removeOne(Map<Integer, Stack<String>> map, int key) {
Stack<String> stack = map.get(key);
String result = stack.pop();
if(stack.isEmpty()){
map.remove(key);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我试过做类似的事情
map.compute(1, (k, v) -> {v.pop(); return v.size() == 0 ? null : v;});
Run Code Online (Sandbox Code Playgroud)
但即使它确实删除了条目,如果为空,我不知道如何获取返回的值pop().
Java的PriorityQueue构造函数的复杂性是Collection多少?我用了构造函数:
PriorityQueue(Collection<? extends E> c)
Run Code Online (Sandbox Code Playgroud)
复杂度是O(n)还是O(n*log(n))?
假设我正在构建一个TreeSet对象,其顺序仅取决于一个值。
我不能做
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX));
Run Code Online (Sandbox Code Playgroud)
因为如果我添加两个Foo具有相同对象的不同对象x,那么一个将替换另一个(即,如果我这样做,tree.add(foo1)并且,将代替)。tree.add(foo2)tree.size()12
我可以比较 的每个字段Foo,但我希望 的两个实例Foo被视为不同,即使每个字段都相同。
一种“几乎有效”的解决方案是
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::hashCode));
Run Code Online (Sandbox Code Playgroud)
但当存在哈希冲突时,这会失败。
总之,我正在寻找类似的东西
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::getInternalAddress));
Run Code Online (Sandbox Code Playgroud)
但我们当然无法使用这样的方法。
我知道有解决方法:
TreeMap<Foo, Integer>(并比较所有字段)来给出Foo特定对象的数量xTreeMap<Foo, List<Foo>>(或TreeMap<Integer, List<Foo>>键为x)。但如果“重复”的 foo 很少,那么所有单例列表都会浪费空间。因此,虽然我知道 a 有解决方法TreeMap,但我仍然想知道是否有一种方法可以仅使用 a 来做到这一点TreeSet。
java ×3
collections ×2
binary-heap ×1
comparator ×1
dictionary ×1
hashmap ×1
heap ×1
java-8 ×1
treeset ×1