TreeSet集合排序问题

老冯_f 发布于 2014/01/17 11:03
阅读 203
收藏 0

收藏!数据建模最全知识体系解读!>>>

需求是数组去重,但是要保留原来的顺序,例如:

原始数组是{4,2,4,6,1,2,4,7,8}
  得到结果{4,2,6,1,7,8}
我想用TreeSet集合,然后自定义一个比较器,可是结果却是错误的,代码如下:

import java.util.*;
public class Text {


	public static void main(String[] args) {
		int[] s={4,2,4,6,1,2,4,7,8};
		for(int x:quChong(s))
			System.out.print(x+" ");

	}
	public static int[] quChong(int[] arr){
		TreeSet<Integer> a=new TreeSet(new MyCompare());
		for(int x=0;x<arr.length;x++){
			a.add(arr[x]);
		}
		System.out.println(a);
		int[] i=new int[a.size()];
		int temp=0;
		for(Integer j:a){
			
			i[temp++]=j;
		}
		return i;
	}
   
	
}

//自定义比较器,使元素按照存入的先后顺序存储
class MyCompare implements Comparator{
	public int compare(Object o1,Object o2){
		int num;
		Integer i1=(Integer)o1;
		Integer i2=(Integer)o2;
		num=i1.compareTo(i2);
		if(num==0)
			return 0;
		return 1;
	}
}



结果是 4 2 6 1 4 7 8 ,有重复元素。我没弄明白问题出在哪里了,请大家帮忙看看

而且,测试的时候看到新添加进集合的元素并没有跟所有已有元素比较

请大家看看这个自定义比较器有问题么

加载中
0
yzChen233
yzChen233
Integer[] s = {4,2,4,6,1,2,4,7,8};
List<Integer>list = Arrays.asList(s);
List<Integer> ret = new ArrayList<Integer>();
for (Integer integer : list) {
if(!ret.contains(integer)) {
ret.add(integer);
}
}

System.out.println(ret);

匹配就可以了,不需要set集合

-------------------------------------------------------------------

加上打印日志,可以看出是treemap的问题

import java.util.Comparator;
import java.util.TreeSet;


public class Test {


public static void main(String[] args) {
int[] s = { 4, 2, 4, 6, 1, 2, 4, 7, 8 };
for (int x : quChong(s))
System.out.print(x + " ");


}


public static int[] quChong(int[] arr) {
TreeSet<Integer> a = new TreeSet(new MyCompare());
for (int x = 0; x < arr.length; x++) {
System.out.println("------------------------------");
a.add(arr[x]);
System.out.println("aaaaaaaaaaaa" + a);
}
int[] i = new int[a.size()];
int temp = 0;
for (Integer j : a) {


i[temp++] = j;
}
return i;
}


}


// 自定义比较器,使元素按照存入的先后顺序存储
class MyCompare implements Comparator {
public int compare(Object o1, Object o2) {
int num;
System.out.println("o1:"+o1);
System.out.println("o2:"+o2);
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
System.out.println("i1:"+i1);
System.out.println("i2:"+i2);
//-1 小于   0 等于   1  
num = i1.compareTo(i2);
System.out.println("num:"+num);
if (num == 0)
return 0;
return 1;
}
}

在读到“第三个4”的时候,打印结果是:

------------------------------
o1:4
o2:2
i1:4
i2:2
num:1
o1:4
o2:6
i1:4
i2:6
num:-1
o1:4
o2:1
i1:4
i2:1
num:1
aaaaaaaaaaaa[4, 2, 6, 1, 4]
------------------------------
也就是说,treemap里面根本就没有把它自己里面的4跟“第三个4”匹配。

老冯_f
老冯_f
谢谢你,但是我想知道我的代码错在哪里
0
lock_free
lock_free
num=i1.compareTo(i2); 会有 1,-1,0  三个值。 按你这MyCompare 写的意思,只要o1,o2不等,o1 就大于o2?
lock_free
lock_free
回复 @女汉子_油菜花 : 排序只有升序和降序。我想你的思路是错的。
老冯_f
老冯_f
因为我想保证元素的顺序跟原数组一致!如果不定义比较器,那么顺序就会从小到达排列额
0
lock_free
lock_free
import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        int[] a = new int[] { 4, 2, 4, 6, 1, 2, 4, 7, 8 };
        Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        for (int i = 0; i < a.length; i++) {
            if (map.get(a[i]) == null) {
                System.out.println(a[i]);
                map.put(a[i], Boolean.TRUE);
            }
        }
    }
}



返回顶部
顶部