黑马程序员技术交流社区

标题: 关于treeSet集合排序问题 [打印本页]

作者: 崔宝东    时间: 2013-4-27 10:58
标题: 关于treeSet集合排序问题
本帖最后由 崔宝东 于 2013-4-27 18:17 编辑

String str = "90 -7 0 18 2 45 4";
  String[] arr = str.split(" ");
  TreeSet<String> ts = new TreeSet<String>();
  for (int j = 0; j < arr.length; j++) {
   ts.add(arr[j]);
  }
  Iterator<String> it = ts.iterator();
  while(it.hasNext())
  {
   String str1 = it.next();
  }
  System.out.println(ts);//为什么这么写代码不能达到自然排序的要求;字符串本身也是有顺序的为什么在TreeSet里面没有作用呢?
字符串本身也是按照编码表排列的,所以就应该打印出正常的顺序呀。

我知道可以用Integer,我就是想知道为什么不能用String去排序,任何字符串再编码表中都有固定的值,难道"1”和"2”在编码表中"1“还能比"2”大?这样也不符合逻辑呀?

作者: 袁梦希    时间: 2013-4-27 11:06
我先写点东西  一会帮你解答  楼主
作者: 张洪慊    时间: 2013-4-27 11:30
注意你是存放在字符串数组中的也就是说每个元素都是一个字符串
例如:"18"  "2" 按字符串的自然顺序比较那就是 '1'的ASCII码<'2' 那么"18"<"2"

如果想要按照整数的自然顺序,那么我们利用Integer:
修改下你的代码:

  1. import java.util.*;
  2. class IntSort{
  3. public static void main(String[] args){
  4.         String str = "90 -7 0 18 2 45 4";
  5.           String[] arr = str.split(" ");
  6.           TreeSet<Integer> ts = new TreeSet<Integer>();
  7.           for (int j = 0; j < arr.length; j++) {
  8.            ts.add(Integer.parseInt(arr[j]));//转换成整数->装箱存入
  9.           }
  10.           Iterator<Integer> it = ts.iterator();
  11.           while(it.hasNext())
  12.           {
  13.            Integer str1 = it.next();
  14.           }
  15.           System.out.println(ts);
  16.         }
  17. }
复制代码

作者: 蔚蓝小嗨    时间: 2013-4-27 14:58
其实也排序了,只不过排序方法不一样,String类型的比较的是字符串的哈希值,要按照数字大小排序,还是要用Integer
作者: 曹德君    时间: 2013-4-27 16:22
我试了一下。这个已经排序了。排序的规则是,按照数值的首个数值的大小排列的。上面的18首数字是1.所以他排序在2的前面。
作者: 张洪慊    时间: 2013-4-27 18:37
"18"与"2"以字符串的形式怎么比?
18
2
'1'<'2',那么下面不再比了,"2">"18" 类比: "ac" "b"
作者: 曹德君    时间: 2013-4-27 20:28
张洪慊 发表于 2013-4-27 18:37
"18"与"2"以字符串的形式怎么比?
18
2

他用不是已经把字符串存到字符数组里面了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2