我是Scala的新手.我在我的代码中使用了SortedMap,我想使用mapValues创建一个新的地图,并对值进行一些转换.
mapValues函数返回一个新的Map,而不是返回一个新的SortedMap,然后我必须将其转换为SortedMap.
例如
val my_map = SortedMap(1 -> "one", 0 -> "zero", 2 -> "two")
val new_map = my_map.mapValues(name => name.toUpperCase)
// returns scala.collection.immutable.Map[Int,java.lang.String] = Map(0 -> ZERO, 1 -> ONE, 2 -> TWO)
val sorted_new_map = SortedMap(new_map.toArray:_ *)
Run Code Online (Sandbox Code Playgroud)
这看起来效率低下 - 最后一次转换可能会再次对键进行排序,或者至少验证它们是否已排序.
我可以使用普通的map函数,它既可以对键和值进行操作,也可以故意不改变转换函数中的键.这看起来太低效,因为执行地图可能假设转换可以(在的情况下,如:改变键的顺序my_map.map(tup => (-tup._1, tup._2)) -所以它可能"重新排序"他们.
有人熟悉Map和SortedMap的内部实现,可以告诉我我的假设是否正确吗?编译器能否自动识别出密钥没有重新排序?是否有内部原因导致mapValues不应返回SortedMap?有没有更好的方法来转换地图的值而不会失去键的顺序?
谢谢
有没有人知道TreeMap操作的时间复杂度 - 例如 - subMap,headMap.的tailMap.
像get,put这样的操作的时间复杂度是O(logn).但javadoc并没有说明上述操作的复杂性.
最糟糕的情况复杂性我可以想到O(n),因为如果集合包含最后一个元素,它将遍历整个列表.我们可以证实吗?
是否可以在d3中制作树图,每个矩形的背景是图像?我在寻找类似的什么在Silverlight做了这里,但D3.如果可能,是否有任何推荐的教程贯穿将背景连接到图像的过程?
我正在使用D3.js构建一个应用程序,它在树形图中显示数据.理想情况下,我想给树图提供一个工具提示,以在树图的每个节点上显示更多信息.树映射从.JSON文件提供数据.
我目前正在使用jquery插件Poshy Tip,我可以通过该title=属性传递此信息.我知道我需要以某种方式将title属性添加到树形图中的svg:g元素,但我无法弄清楚我在哪里设置每个节点的标题attr.
继承我脚本的开头,我做了所有声明等等......
<div id="chart"></div>
<script type="text/javascript">
var tree = d3.layout.tree()
.size([h, w - 160]);
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
var vis = d3.select("#chart").append("svg:svg")
.attr("width", w)
.attr("height", h)
.append("svg:g")
.attr("transform", "translate(40,0)");
d3.json("test.json", function(json) {
json.x0 = 800;
json.y0 = 0;
update(root = json);
});
Run Code Online (Sandbox Code Playgroud)
这是我poshytip()在头脑中使用的方式
$(function(){
$('node').poshytip({slide: false, followCursor: true, alignTo: 'cursor',
showTimeout: 0, hideTimeout: 0, alignX: 'center', alignY: 'inner-bottom',
className: 'tip-twitter'});
}
Run Code Online (Sandbox Code Playgroud)
我只是希望能够"鼠标悬停"交互式树形图中的各个项目并获得弹出的工具提示..但我没有运气.如何设置每个项目具有特定的ID ..我是否在.JSON文件中执行此操作?有更简单的方法吗?我是以错误的方式解决这个问题吗?任何帮助都会很棒.
可能重复:
如何在Java中对Map的键进行排序?
在类中TreeMap,Java API说:
基于红黑树的NavigableMap实现.地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序.
自然排序是什么意思?用作键的类不必实现Comparable接口,但是将使用什么顺序?
加载1 000 000个数字需要2秒才能加载到树形图(二叉搜索树)中,但需要几毫秒才能加载到hashmap(在java中).
两者之间的唯一区别是我可以看到我可以设置一个hashmap的初始大小,因此它不需要经常重新调整大小.
假设TreeMap的数组的初始大小应该能够设置,我错了吗?它有这么慢的原因吗?
是否存在逻辑上的原因导致无法设置TreeMap或任何通用二叉搜索树的大小,或者这是错误的?
Java 的 getOrDefault 是一个很好的构造,可以单行访问映射值或起点(如果不存在)。我在 C++ 的地图参考中没有看到任何并行的内容。是否存在某些东西或者是您自己构建的?
我在地图中有对象,如果它们存在,我会更新它们,但如果它们不存在,我会构造新的。使用 getOrDefault,我可以在默认端构造对象,或者访问它(如果存在)。
http://www.cplusplus.com/reference/map/map/
https://www.geeksforgeeks.org/hashmap-getordefaultkey-defaultvalue-method-in-java-with-examples/
我正在制作TreeMap<String, String>并希望以降序的方式订购它.我创建了以下比较器:
Comparator<String> descender = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
};
Run Code Online (Sandbox Code Playgroud)
我像这样构造TreeMap:
myMap = new TreeMap<String, String>(descender);
但是,我收到以下错误:
The method compare(String, String) of type new Comparator<String>(){} must override a superclass method
Run Code Online (Sandbox Code Playgroud)
我从未完全弄清楚仿制药,我做错了什么?
为什么TreeMap类型Map没有定义方法tailMap或headMap.
Map<String, String> map = new TreeMap<>();
map.tailMap(); //cannot resolve method tailMap
Run Code Online (Sandbox Code Playgroud)
使用显式转换它可以工作:
((TreeMap<String, String>) map).tailMap("a");
Run Code Online (Sandbox Code Playgroud)
随着NavigableMap一切都很好:
NavigableMap<String, String> map1 = new TreeMap<>();
map1.tailMap("a");
Run Code Online (Sandbox Code Playgroud)
如果我是对的,因为界面Map缺少相应的方法,尽管面对对象map是类的具体实现TreeMap,当然确实拥有这样的方法.
只是寻找更详细的解释.
谢谢!
HashMap(myHashMap.entrySet().iterator().next()和myHashMap.keySet().iterator().next()和myHashMap.values().iterator().next())的所有3个集合视图迭代器的时间复杂度在javadoc中有详细记录,所有这3个迭代器都是O(n + c)(n是映射数,c是容量,是物理数量)哈希表中的桶).
但是3个相应的TreeMap集合视图的3个迭代器呢?官方的javadoc没有说什么.它们的复杂性是什么?我确实看过SE8源代码,但我不能从那里判断.