这个定制的Valuecomparator按其值对TreeMap进行排序.但是在搜索TreeMap是否具有某个键时,它不会容忍nullpointexception.如何修改比较器来处理nullpoint?
import java.io.IOException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class TestTreeMap {
public static class ValueComparator<T> implements Comparator<Object> {
Map<T, Double> base;
public ValueComparator(Map<T, Double> base) {
this.base = base;
}
@Override
public int compare(Object a, Object b) {
/*if (((Double) base.get(a) == null) || ((Double) base.get(b) == null)){
return -1;
} */
if ((Double) base.get(a) < (Double) base.get(b)) {
return 1;
} else if ((Double) base.get(a) == (Double) base.get(b)) {
return 0;
} else {
return …Run Code Online (Sandbox Code Playgroud) 我有一个带有TreeMap的可序列化对象.
Map<String, Dogs> dogsByNames = Maps.newTreeMap(); // guava style
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好.现在忽略键的情况是必要的:
Map<String, Dogs> dogsByNames = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为String.CASE_INSENSITIVE_ORDER不是serialzable:
com.google.gwt.user.client.rpc.SerializationException:类型'java.lang.String $ CaseInsensitiveComparator'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象.出于安全考虑,此类型不会被序列化:instance = java.lang.String$CaseInsensitiveComparator@f26f68
所以我创建了自己的一个:
private static abstract class MyComparator<T>
implements
Comparator<T>, // extends Ordering<T> do not work
IsSerializable { // Serializable do not work
}
public static final MyComparator<String> CASE_INSENSITIVE_ORDER = new MyComparator<String>() {
@Override
public int compare(final String left, final String right) {
if (null == left) {
return (null == right) ? 0 : -1;
} else if (null == …Run Code Online (Sandbox Code Playgroud) 我试图让d3树图动画,并有类似的东西
App.svg = d3.select("#medals-tree-map").append("svg:svg")
.style("width", App.canvasWidth)
.style("height", App.canvasHeight)
.append("svg:g")
.attr("transform", "translate(-.5,-.5)")
.attr("id", "container");
App.treemap = d3.layout.treemap()
.size([App.canvasWidth + 1, App.canvasHeight + 1])
.value(function(d) { return d.number; })
.sticky(true);
function drawGraphFromJson(data) {
// Draw the graph
var leaves = App.treemap(data);
var cell = App.svg.selectAll("g.cell")
.data(leaves);
// More rendering code
}
Run Code Online (Sandbox Code Playgroud)
根据这个答案:https://stackoverflow.com/a/9650825/111884
但是,当我drawGraphFromJson使用新数据调用时,树图完全没有变化.
我通过定义ie App.treemap内部来解决问题drawGraphFromJson
function drawGraphFromJson(data) {
App.treemap = d3.layout.treemap()
.size([App.canvasWidth + 1, App.canvasHeight + 1])
.value(function(d) { return d.number; })
.sticky(true);
// Draw …Run Code Online (Sandbox Code Playgroud) 我想在R中生成树图.现在我正在使用投资组合包,但是这个包的问题在于没有足够的方法来控制输出:文本属性,如字体,字体大小,颜色无法控制,相同颜色的地图方块之间的边界无法区分,无法控制颜色渐变图例等.
我正在寻找一个树形图库,它允许对结果外观进行比组合包更细粒度的控制.
在R中制作树图的投资组合包有哪些替代方案?
好的SortedMap/ SortedSet是一个接口,和TreeMap/ TreeSet是它的实现.它们都按顺序排列元素,对吧?那么为什么我们需要TreeMap/ TreeSet?
所以我试图将一定长度的所有字符串从字符串集合(可以是集合或列表)移动到 TreeMap 并将每个字符串中的字符集设置为该字符串的键,但行map.put(keyRinger(word), word);投掷java.lang.ClassCastException: java.util.TreeSet cannot be cast to java.lang.Comparable
Map<Set<Character>, String> map = new TreeMap<Set<Character>, String>();
for (String words : words) {
if (word.length() == length) {
map.put(keyRinger(word), word);
}
}
Run Code Online (Sandbox Code Playgroud)
这是keyRing万一你好奇的方法。
private Set<Character> keyRinger(String current) {
Set<Character> keyRing = new TreeSet<Character>();
for (int i = 0; i < current.length(); i++) {
char key = current.charAt(i);
keyRing.add(key);
}
return keyRing;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是我能做些什么来避免这种情况?我读过我需要一个Comparator或来实现,Comparable但我不知道如何做到这一点,我认为可能有一个更简单的解决方案(尽管可能效率不高)。
在一个项目中,我需要删除键值大于某个键的所有对象(键类型是Date,如果重要的话).
据我所知,TreeMap在Java中实现的是一个红黑树,它是一个二叉搜索树.O(n)删除子树时我应该得到.
但除了制作尾部视图并逐个删除之外,我找不到任何方法来执行此操作O(logn).
有没有实现这个功能的好主意?我相信treeMap是正确使用的数据结构,应该能够做到这一点.
提前致谢
我有以下两个类来定义我想要放入TreeMap的对象:
class GeneKey {
String PN;
int PW;
// Generator makes unique TreeMap key.
GeneKey(String a, int b){
this.PN = a;
this.PW = b;
}
}
Run Code Online (Sandbox Code Playgroud)
然后是第二个对象:
class GeneValue {
String info;
String date;
// Generator makes TreeMap value
GeneValue(String a, String b){
this.info = a;
this.date = b;
}
}
Run Code Online (Sandbox Code Playgroud)
我想制作一个TreeMap:
import java.util.TreeMap;
// In main ...
TreeMap<GeneKey, GeneValue> samples = new TreeMap<GeneKey, GeneValue>();
String a = "test";
int b = 100;
String c = "test again";
String d …Run Code Online (Sandbox Code Playgroud) 我正在使用Google-Charts Treemap来显示大量节点.默认行为是当用户左键单击节点时向下移动树,并在用户右键单击图形时向上移动树.右键单击每次点击重绘图表.由于节点数量很大,重绘速度非常慢.如何在不禁用鼠标单击事件的情况下禁用节点向下移动功能?如何提高树图绘制的性能?
谢谢
我有一个TreeMap<Integer, Integer>实例,我想以最低键分配给最低值和最高键分配给最高键的方式重新分配键值映射。
这是我在没有流的情况下如何做到的:
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(1, 6);
map.put(2, 9);
map.put(4, 2);
map.put(3, 1);
map.put(8, 10);
map.put(5, 10);
ArrayList<Integer> valueList = new ArrayList<Integer>(map.values());
Collections.sort(valueList);
int i = 0;
for (Map.Entry entry : map.entrySet()) {
entry.setValue(valueList.get(i++));
}
System.out.println(map);
Run Code Online (Sandbox Code Playgroud)
输出:
{1=1, 2=2, 3=6, 4=9, 5=10, 8=10}
Run Code Online (Sandbox Code Playgroud)
欢迎任何有关如何使用 java-8 Stream API 执行此类任务的提示。
谢谢
treemap ×10
java ×7
javascript ×2
charts ×1
collections ×1
comparator ×1
d3.js ×1
dictionary ×1
guava ×1
gwt ×1
java-8 ×1
java-stream ×1
portfolio ×1
r ×1
sorting ×1
treeset ×1