黑马程序员技术交流社区

标题: 如何让一个Set集合有序的排列 [打印本页]

作者: 刘冲    时间: 2013-9-30 14:36
标题: 如何让一个Set集合有序的排列
下面有个程序,需要按照一定的规则进行显示出来,应该怎么做?
public class SetDemo{
   private String name;
   private int age;
   private Person person;
   
   public SetDemo(){}

   public SetDemo(String name, int age, Person person){
      this.name = name;
      this.age = age;
      this.person = person;
   }
}

class Person{
   private String cardId;
   private int sex;
   public void setCardId(String cardId){
      this.cardId = cardId;
   }
   public String getCardId(){
      return this.cardId;
   }
   public void setSex(int sex){
      this.sex = sex;
   }
   public int getSex(){
      return this.sex;
   }
}

public class Test{
   public static void main(String[] args){
      SetDemo sd = new SetDemo();
      Set<SetDemo> set = new HashSet<SetDemo>();
      set.add(new SetDemo("",20,new Person()));
   }
}


根据以上的代码,测试类中的Set集合取出的时候是无序的,但是需要按照Person的cardId按照指定 的顺序排序显示,对于这个问题没有什么思路,希望各位高手指点一下,非常感谢!
作者: long362144768    时间: 2013-9-30 17:28
本帖最后由 long362144768 于 2013-9-30 17:46 编辑

我发现你的类很混乱,看不懂你的SetDemo做什么用呢,我这里有个类似代码,你看看说不定能对你有用

  1. <P>import java.util.Comparator;
  2. import java.util.TreeSet;</P>
  3. <P>import java.util.Set;

  4. /**
  5. *第十题:声明类Student,包含3个成员变量:name、age、score,
  6. *创建5个对象装入TreeSet,按照成绩排序输出结果(考虑成绩相同的问题)
  7. * @author chenlong
  8. */

  9. public class Test10 {
  10.         public static void main(String[] args) {
  11.                 Set<student> treeSet = new TreeSet<student>(
  12.                         //定义匿名内部类进行定制降序排序,实现comparator接口
  13.                         new Comparator<Object>(){
  14.                                 public int compare(Object o1, Object o2){
  15.                                         student s1 = (student) o1;
  16.                                         student s2 = (student) o2;</P>
  17. <P>                                        //保证是降序排列,如果是return s1.score >= s2.score? 1:-1;则为升序排列
  18.                                         return s1.score >= s2.score? -1:1;
  19.                                 }
  20.                         }
  21.                 );
  22.                 treeSet.add(new student("张三", 23, 76));
  23.                 treeSet.add(new student("李四", 24, 84));
  24.                 treeSet.add(new student("王五", 22, 91));
  25.                 treeSet.add(new student("赵六", 23, 87));
  26.                 treeSet.add(new student("钱七", 24, 84));
  27.                 System.out.println(treeSet);
  28.         }
  29. }


  30. class student implements Comparable<Object>{//实现comparable借口
  31.         String name;
  32.         int age;
  33.         double score;

  34.         public student(String name, int age, double score) {
  35.                 this.name = name;
  36.                 this.age = age;
  37.                 this.score = score;
  38.         }
  39.         
  40.         public String toString(){
  41.                 return "student对象:"+this.name+" 年龄"+this.age+" 成绩"+this.score;
  42.                
  43.         }
  44.         
  45.         //主要用于消除相同元素,姓名和年龄相同则视为同一对象
  46.         @Override
  47.         public int compareTo(Object o) {
  48.                 student stu = (student) o;
  49.                 int num = this.name.compareTo(stu.name);
  50.                 return 0 == num?new Integer(this.age).compareTo(new Integer(stu.age)):num;
  51.         }
  52.         
  53. }
  54. </P>
复制代码

作者: straw    时间: 2013-10-2 10:12
哥们,HashSet是没有排序功能的,而且每次存储进去的对象都是随机无序的.想要使集合有一定的排序功能就得用TreeSet或TreeMap两种集合分别在调用集合构造函数的时候传入Comparator对象或者实现Comparable接口再复写compareTo方法
作者: kangxiaoning    时间: 2013-10-3 16:46
我试着整了一下但这个代码太乱了我也不是大神,没弄好,不过我说说我认为存在的问题吧,
1居然有两个用public修饰的类
2SetDemo感觉很多余,是象只有通过cardid才能得到姓名吗?将cardid和姓名分开?
3传参数的时候太麻烦了,你得传姓名 年龄,然后传 person类,person类中还得传入cardid(貌似不能直接传,我就是这里没弄懂),而你创建的那个名字是空的我理解了,但是都没有传cardid怎么比较啊?
4为什么用hashset感觉treeset的比较强更容易实现
不过总之我没弄出来,有点乱,毕竟我水平有限,这只是我觉得我在整的时候对你的一些感觉,希望对你有用
作者: 黄文伯    时间: 2013-10-4 22:00
亲,如问题已解决请将分类的“未解决”改为“已解决”。 以后的问题贴也要及时更改分类哦~




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