在TreeSet中有一个名为contains的方法,如果元素在集合中,则返回true.我假设此方法使用二进制搜索,并不按升序迭代所有元素.我对吗?
我有一个TreeSet,它包含一个类的对象,该类使用两个String实例变量来区分它与同一个类的其他对象.我希望能够通过比较两个实例变量(当然使用get方法)和另外两个String变量来创建一个搜索TreeSet的方法,如果它们相等,则返回该元素.如果实例变量小于转到右子树中的第一个元素,或者如果它们在左子树中搜索更大等等.有没有办法做到这一点?
我知道我可以将对象存储在ArrayList中并使用二进制搜索来查找对象,但这不会像搜索TreeSet那么快.
我认为这null是允许的Set.
那么为什么以下代码:
SortedSet<Integer> set = new TreeSet<Integer>();
set.add(null);
set.add(1); //--->Line indicated by exception
Run Code Online (Sandbox Code Playgroud)
给出以下例外?
java 中java.util.TreeMap.put(未知来源)的
java.lang.Integer.compareTo(未知来源)中的
java.lang.Integer.compareTo(未知来源)中的线程"main"java.lang.NullPointerException中的异常. util.TreeSet.add(未知来源)
如果我想删除log(n)Java中的最高条目TreeSet,我会使用treeSet.pollFirst()- Scala mutable.TreeSet类的等价物是什么?
总之,我真正想要的是一个堆状的优先级队列中的数据结构,让我removeMax,add并updatePriority在对数时间.我看了Scala集合库,我很困惑 - 虽然mutable.PriorityQueue让我deque(即removeMax)在对数时间 - 它没有提供更新日志时间的优先级(我必须hackily扫描和删除项目并重新添加线性时间) .同样mutable.TreeSet会让我在对数时间内更新优先级(通过hackily删除和重新添加),但它没有removeMax(即pollFirst)操作.我应该使用什么样的集合容器?请不要将我介绍给外部依赖项.
我想使用以下内容在Map中打印一个有序列表:
Map<Float, String> mylist = new HashMap<>();
mylist.put(10.5, a);
mylist.put(12.3, b);
mylist.put(5.1, c);
SortedSet<Float> orderlist = new TreeSet<Float>(mylist.keySet());
for (Float i : orderlist) {
System.out.println(i+" "+mylist.get(i));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打印:
5.1 c
10.5 a
12.3 b
Run Code Online (Sandbox Code Playgroud)
但是如何以相反的顺序打印订单列表,如下所示:
12.3 b
10.5 a
5.1 c
Run Code Online (Sandbox Code Playgroud) 是否有一个原因,对象TreeSet.apply方法返回SortedSet,而不是TreeSet?
以下代码不会在scala 2.7中编译
val t:TreeSet[Int] = TreeSet(1,2,3)
Run Code Online (Sandbox Code Playgroud) 在我的代码中,Java TreeSet迭代是主要的时间因素.在查看系统时,我认为它是O(n)复杂性.任何人都可以验证吗?
我想通过提供从子节点到父节点的向后链接,我可以提高性能.
如果我使用Set类似于此:
Set<node> s=new TreeSet<node>();
class node {
private int x;
private int y;
}
Run Code Online (Sandbox Code Playgroud)
这是否可以接受,因为它是一个TreeSet,它还会对它进行排序吗?
我的列表包含类似的集合[1,3,5][2,6,4],大小相同.我试过这样做,但似乎没有用.
List<TreeSet<T>> block;
for(TreeSet<T> t : block){
block.stream().sorted((n,m)->n.compareTo(m)).collect(Collectors.toSet());
}
Run Code Online (Sandbox Code Playgroud)
我想要的最终结果是[1,2,3][4,5,6].
我可以尝试添加在所有的元素ArrayList和那种出来再做出新List的TreeSet的.但是有一种衬垫吗?
更新:
List<T> list=new ArrayList<T>();
for(TreeSet<T> t : block){
for(T t1 : t)
{
list.add(t1);
}
}
list=list.stream().sorted((n,m)->n.compareTo(m)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这有效但可以简化吗?
Java中TreeSet方法的计算复杂度是否与AVLTree相同?
具体来说,我想知道以下方法的计算复杂性:1.add 2.remove 3.first 4.last 5. floor 6. higher
用于方法描述的Java Doc:http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
对于AVL树,有所有O(logn)?什么是上述TreeSet方法的复杂性?
我需要一种TreeSet真正快速地计算小于Integers中的X的元素数的方法。
我可以用
方法,但它们确实很慢(我只需要计数,而不是数字本身)。有办法吗?
谢谢。
编辑:
我发现了一种变通方法,可以使事情更快!我正在使用BitSet及其cardinality()方法。我首先创建一个BitSet,然后为添加到TreeSet中的每个元素设置BitSet中的相应索引。现在,要计算少于XI的元素数量,请使用:
bitset.get(0,X + 1).cardinality()
与treeset.subSet(0,true,X,true).size()相比,这要快得多。
有人知道为什么吗?我假设BitSet.cardinality()不使用线性搜索。