小编Ric*_*ola的帖子

Java 8集合映射从集合中删除元素,如果为空则删除条目

我有一个地图,其值是一个集合.给定一个键,我想删除该集合的一个元素并将其返回,但如果该集合为空,我还想删除该条目.有没有办法使用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 collections dictionary hashmap java-8

11
推荐指数
2
解决办法
301
查看次数

从集合构建PriorityQueue的时间复杂度是多少?

Java的PriorityQueue构造函数的复杂性是Collection多少?我用了构造函数:

PriorityQueue(Collection<? extends E> c)
Run Code Online (Sandbox Code Playgroud)

复杂度是O(n)还是O(n*log(n))?

java heap collections priority-queue binary-heap

6
推荐指数
1
解决办法
3241
查看次数

Java 对象上的任意比较器

假设我正在构建一个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特定对象的数量x
  • 如果我确实关心对象(我正在进行引用相等性检查),我可以使用不同的多重集TreeMap<Foo, List<Foo>>(或TreeMap<Integer, List<Foo>>键为x)。但如果“重复”的 foo 很少,那么所有单例列表都会浪费空间。

因此,虽然我知道 a 有解决方法TreeMap,但我仍然想知道是否有一种方法可以仅使用 a 来做到这一点TreeSet

java comparator treeset

3
推荐指数
1
解决办法
233
查看次数