好吧,我测试了TreeMap,但它没有考虑字符串比较中的IgnoreCase.我需要按字典顺序排序并忽略大小写.还有其他方法吗?
谢谢,这是有效的(TreeMap(Comparator c)).但是,我有另一个问题:
public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() {
public int compare(Object h1, Object h2) {
String s1 = h1.getId();
String s2 = h2.getId();
return s1.compareToIgnoreCase(s2);
}
}; //STR_IGN_CASE_COMP
Run Code Online (Sandbox Code Playgroud)
如何将比较器广泛化以适应不同的对象?假设所有人都有getId()方法.
谢谢,马丁
public final Comparator<String> ID_IGN_CASE_COMP = new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
private Map< String, Animal > _animals = new TreeMap< String, Animal >(ID_IGN_CASE_COMP);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何使用方法get(id)忽略给定的比较器.我希望地图按Case Insensitive排序,但是,当我通过给定键获取值时,我希望它区分大小写.
我的问题非常基本,但我自己找不到解决方案.
我习惯用C++编写算法.在那里,我经常使用该std::map结构以及它提供的所有辅助方法.
此方法将迭代器返回到地图的第一个元素,其中键> =到作为参数给出的键.例:
map<int, string> m;
// m = { 4 => "foo", 6 => "bar", 10 => "abracadabra" }
m.lower_bound(2); // returns iterator pointing to <4, "foo">
m.lower_bound(4); // returns iterator pointing to <4, "foo">
m.lower_bound(5); // returns iterator pointing to <6, "bar">
Run Code Online (Sandbox Code Playgroud)
很酷的是,C++地图基于红黑树,因此查询是对数(O(log n)).
现在我需要在Java中实现某种算法.我需要与我刚才描述的功能类似的功能.我知道我可以使用TreeMap在有序树中实现的.但是我似乎没有找到相应的方法lower_bound.有这样的吗?
非常感谢您的帮助.
我目前正在尝试在Javascript中实现树图算法.更具体地说,在Squarified Treemaps中描述的算法.给出的伪代码如下所示:
procedure squarify(list of real children, list of real row, real w)
begin
real c = head(children);
if worst(row, w) <= worst(row++[c], w) then
squarify(tail(children),row++[c], w)
else
layoutrow(row);
squarify(children,[], width());
fi
end
Run Code Online (Sandbox Code Playgroud)
但我的JavaScript看起来像:
var c = children[0];
if (worst(row, w) >= worst(row.concat(c), w)) {
this.squarify(children.splice(1), row.concat(c), w);
} else {
layoutrow(row);
this.squarify(children, [], width());
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我的代码工作正常,但不平等是错误的方法.我假设我在实现中忽略了某些东西,或者伪代码中的不等式是不正确的?谢谢
我想知道这是什么意思时的javadoc的TreeSet说
这个类实现了由TreeMap实例支持的Set接口?
在下面的示例中,我还没有实现该Hashcode方法,但仍按预期工作,即它能够对对象进行排序.请注意,我故意没有实现一致的Equals实现来检查TreeSet行为.
import java.util.TreeSet;
public class ComparisonLogic implements Comparable<ComparisonLogic>{
String field1;
String field2;
public String toString(){
return field1+" "+field2;
}
ComparisonLogic(String field1,String field2){
this.field1= field1;
this.field2= field2;
}
public boolean equal(Object arg0){
ComparisonLogic obj = (ComparisonLogic) arg0;
if(this.field1.equals(obj.field1))
return true;
else
return false;
}
public int compareTo(ComparisonLogic arg0){
ComparisonLogic obj = (ComparisonLogic) arg0;
return this.field2.compareToIgnoreCase(obj.field2);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种更简单的方法来限制文本标签的宽度而不是使用剪辑路径.
以下是我正在寻找的标签示例:treemap:

请注意,标签会被包含切片的边界截断.
该特定示例使用<div>标记实现,默认情况下具有此行为.但是我正在使用SVG <rect>,我希望有一种更直接的方法,而不是一个定义另一个矩形的单独剪辑路径.
我需要一个Collection对元素进行排序,但不会删除重复项.
我已经去了TreeSet,因为TreeSet实际上将值添加到支持TreeMap:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
Run Code Online (Sandbox Code Playgroud)
TreeMap使用Comparators compare逻辑删除重复项
我写了一个Comparator在相同元素的情况下返回1而不是0.因此,在相同元素的情况下,TreeSet使用它Comparator不会覆盖副本,只会对其进行排序.
我已经测试了它的简单String对象,但我需要一组自定义对象.
public static void main(String[] args)
{
List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );
Set<String> strSet = new TreeSet<String>(new StringComparator());
strSet.addAll(strList);
System.out.println(strSet);
}
class StringComparator implements Comparator<String>
{
@Override
public int compare(String s1, String s2)
{
if(s1.compareTo(s2) == 0){
return 1;
}
else{
return s1.compareTo(s2);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我使用了TreeMap键是a的位置String,值是类型Integer.当我输出Map对象时,它不按排序顺序打印.
这是我使用的代码:
TreeMap<String, Integer> m = new TreeMap<String, Integer>();
m.put("Hello", 1);
m.put("world", 2);
m.put("Zertt", 5);
m.put("Hello", 1);
m.put("world", 2);
System.out.println("map : " + m);
Run Code Online (Sandbox Code Playgroud)
我希望输出像这样排序:
map:{Hello = 1,world = 2,Zertt = 5}
但相反,我得到了这个:
map:{Hello = 1,Zertt = 5,world = 2}
我试图根据以下示例在D3 v4中为我的树形图添加缩放行为:1和2.它是用HTML元素而不是SVG构建的,我通过使用百分比而不是像素单位使其响应.
它到目前为止工作得很好但现在我想通过点击放大到单个细胞,直到到达最后一个孩子.然后点击将返回到树的根.
到目前为止,这是我的代码:http://codepen.io/znak/pen/qapRkQ
我正在努力使用在V4中工作的缩放功能,它遍布整个地方:
function zoom(d) {
console.log('clicked: ' + d.data.name);
x.domain([d.x0, d.x1]);
y.domain([d.y0, d.y1]);
var t = d3.transition()
.duration(800)
.ease(d3.easeCubicOut);
chart
.merge(cell)
.transition(t)
.style("left", function(d) { return x(d.x0) + "%"; })
.style("top", function(d) { return y(d.y0) + "%"; })
.style("width", function(d) { return x(d.x1 - d.x0) + "%"; })
.style("height", function(d) { return y(d.y1 - d.y0) + "%"; });
node = d; //?
d3.event.stopPropagation(); //?
}
Run Code Online (Sandbox Code Playgroud)
如何使用D3 v4更新和转换元素?
谢谢你的任何提示!
treemap ×10
java ×6
collections ×3
javascript ×3
d3.js ×2
treeset ×2
algorithm ×1
c# ×1
c++ ×1
comparator ×1
hashcode ×1
label ×1
map ×1
pseudocode ×1
sorting ×1
svg ×1
winforms ×1