黑马程序员技术交流社区
标题:
关于Treemap的问题
[打印本页]
作者:
李会成
时间:
2013-2-20 16:29
标题:
关于Treemap的问题
我需要用treemap解决排序问题.
我使用了对象类型的 key. key内有一个关键的int是比较排序的唯一值
但我不能用这个int直接作为 treemap的key. 因为有重复,所以这样才把他放入一个对象封装起来.
现在遇到问题:
get,remove 会失败.
因为我在put完成之后是不可能存储 这些对象的, 我有的只是上面是上面所提到的int值.
用这个int值重新new一个key去get的话会获得NULL.
ree.put(new TreeElement(123, "aii"), 123);
//这是remove失败的情况
tree.remove(new TreeElement(123, "aii"));
//这是我的比较器写法:
@Override
public int compare (TreeElement o1, TreeElement o2) {
System.out.println("--->"+o1.value+"; "+o2.value);
if(o1.value > o2.value) {
return -1;
}
else if(o1.value == o2.value && o1.name.equals(o2.name)) {
// 这里进行返回0的操作非常重要,否则无法remove和containsKey
return 0;
}
else {
return 1;
}
}
复制代码
据我猜测, 应该是remove的时候他是根据多个条件来判定是否正确移除的.
至少有:1, 对象地址对比; 2,使用传入的compare比较器 等2个条件
我也想到用继承treemap重写 get remove containskey等等方法 但是好像代价很大,而且而已没参考例子,无从下手...
请教大家如何解决?
我就是肯定要用tree.remove(new TreeElement(123, "aii"));的方式移除.
作者:
胥文
时间:
2013-2-20 20:54
public class TreeMapDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<TreeElement,Integer> map = new TreeMap<TreeElement,Integer>();
map.put(new TreeElement("lisi",100), 1);
map.put(new TreeElement("ahangsan",100), 3);
map.put(new TreeElement("wangwu",100), 2);
map.put(new TreeElement("wangwu",101), 3);
map.put(new TreeElement("zhaoli",100), 4);
System.out.println(map.remove(new TreeElement("zhaoli",100)));
System.out.println(map.get(new TreeElement("wangwu",100)));
Set<TreeElement> set = map.keySet();
Iterator<TreeElement> it =set.iterator();
while(it.hasNext())
{
TreeElement te = it.next();
Integer value = map.get(te);
System.out.println(te+"----"+value);
}
}
}
class TreeElement implements Comparable
{
String name;
public String getName() {
return name;
}
public int getId() {
return id;
}
int id;
TreeElement(String name,int id)
{
this.name = name ;
this.id = id;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof TreeElement))
throw new RuntimeException("类型不匹配");
TreeElement tree = (TreeElement)o;
int num =this.name.compareTo(tree.name);
//System.out.println(this.name+"---compareTo---"+tree.name);
if(num==0)
{
return new Integer(this.id).compareTo(new Integer(tree.id));
}
return num;
}
public String toString()
{
return name+":"+id;
}
}
这样写看行不行
反正我是可以删除和获取
作者:
王钊
时间:
2013-2-20 23:21
我就按照你的描述做的,没有问题的,跟你的代码一样,不信你看:
{:soso_e123:}
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMapTest
{
public static void main(String[] args)
{
TreeMap<TreeElement, Integer> tree = new TreeMap<TreeElement, Integer>(
new Comparator<TreeElement>()
{
public int compare(TreeElement o1, TreeElement o2)
{
System.out.println("--->" + o1.value + "; " + o2.value);
if (o1.value > o2.value)
{
return -1;
}
else if (o1.value == o2.value
&& o1.name.equals(o2.name))
{
// 这里进行返回0的操作非常重要,否则无法remove和containsKey
return 0;
}
else
{
return 1;
}
};
});
tree.put(new TreeElement(123, "aii"), 123);
System.out.println(tree.get(new TreeElement(123, "aii")));//返回对应的value
System.out.println(tree.remove(new TreeElement(123, "aii")));//返回所删除key对应的value
}
}
class TreeElement
{
int value;
String name;
public TreeElement(int value, String str)
{
this.value = value;
this.name = str;
}
}
/**
* 最后打印
* --->123;123
*123
* --->123;123
*123
*/
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2