首页 > 编程知识 正文

顺序表动态分配,java中list排序

时间:2023-05-04 03:34:44 阅读:111416 作者:2164

另一方面,按降序输出int、float、String类型的TreeSet默认按照升序对int、float等基本数据和String类型进行排序,如果想按降序对这样的数据进行排序怎么办? 请不要担心。 TreeSet是descendingSet (); 为了满足这一需求,分别通过int和String数据演示了如何在代码中使用descendingSet )实现降序排序。

1、存储int类型时

publicstaticvoidmain (string [ ] args ) treesetintegerintset=new treeset ); intset.add(23 ); intset.add(68; intset.add(33; intset.add(15 ); intset.add(22 ); intset.add(53; System.out.println ('整数按TreeSet自然排序后输出:'); for(intx:intset ) system.out.printf('%d”,x ); } System.out.println (; treesetintegerreintset=newtreesetinteger (; reintset=(treeset ) intSet.descendingSet ); System.out.println; //其中,intSet.descendingSet ()的结果也相同//(即for (intx : intset.descending set ) ) for ) intx:reintset )

2、存储String类型时

publicstaticvoidmain (string [ ] args ) treesetstringstringset=new treeset ); stringset.add(makor ); stringset.add(jack ); stringset.add(boolo ); stringset.add (小董); stringset.add(3Huan ); stringset.add('3aJK ); system.out.println('string是按TreeSet自然排序后输出的:'); strings : stringset (for ) system.out.printf('%s ',s ); } system.out.println ((按nstring降序输出:) ); strings : stringset.descending set () ) system.out.printf('%s”,s ); }输出如下。

二、在排序自定义对象时,我们需要对自定义类进行排序。 这个时候,使用我们的Comparator接口和Comparable接口。

1、通过比较器Comparator来实现(让容器自身具有比较性)

首先创建自定义对象User。

静态类用户{ int age }; 字符串名称; User () User ) intage,String name ) { this.age=age; this.name=name; } public String toString () ({ return )名称: ' name ),年龄: ' age; 按//age升序排序的比较器staticclassusercompforageimplementscomparator { @ overridepublicintcompare (objecto 1,Object o2 ) ) usese

User u2 = (User)o2; // 注意:此处用自定义类的age来实施比较, // 所以age值相同的元素不能被加入成功 return u1.age - u2.age; } } //根据name来降序排序的比较器 static class UserCompForName implements Comparator { @Override public int compare(Object o1, Object o2) { User u1 = (User)o1; User u2 = (User)o2; // 注意:此处用自定义类的name来实施比较, // 所以name值相同的元素后面不能被加入成功 return u2.name.compareTo(u1.name); } } //根据age降序,若age相同则根据name来升序排序的比较器 //若age和name都相同,则加入不成功 static class UserCompForAgeAndName implements Comparator { @Override public int compare(Object o1, Object o2) { User u1 = (User)o1; User u2 = (User)o2; if (u1.age == u2.age) return u1.name.compareTo(u2.name); return u2.age - u1.age; } } }

然后编写测试方法,此处我们传入的是根据age升序来排序的比较器

(TreeSet<User> userSet = new TreeSet<>(new User.UserCompForAge());):

public static void main(String[] args) { //此处传入的是根据age来排序的,所以后面加入的user中, //如果年龄已经出现过了,就加入不了集合中 TreeSet<User> userSet = new TreeSet<>(new User.UserCompForAge()); userSet.add(new User(18, "zhang")); userSet.add(new User(58, "li")); userSet.add(new User(28, "wang")); userSet.add(new User(28, "wang")); userSet.add(new User(68, "wang")); userSet.add(new User(18, "qian")); userSet.add(new User(18, "wu")); for (User u : userSet) { System.out.println(u.toString()); } }

 运行结果如下:

修改测试代码,将传入的比较器换成根据name降序排序的比较器,只需要修改下面这行代码:

TreeSet<User> userSet = new TreeSet<>(new User.UserCompForName());具体如下: public static void main(String[] args) { //此处传入的是根据name来排序的,所以后面加入的user中, // 如果name已经出现过了,就加入不了集合中 TreeSet<User> userSet = new TreeSet<>(new User.UserCompForName()); userSet.add(new User(18, "zhang")); userSet.add(new User(58, "li")); userSet.add(new User(28, "wang")); userSet.add(new User(28, "wang")); userSet.add(new User(68, "wang")); userSet.add(new User(18, "qian")); userSet.add(new User(18, "wu")); for (User u : userSet) { System.out.println(u.toString()); } }

运行结果如下:

 

 可以发现,TreeSet会根据传入的比较器来去重(即:如果向集合中加入一个元素,它会先将该元素中的一个属性与集合中已有的元素的这个属性进行比较,如果该属性的值已经出现过了,那么这个元素将不能加入集合。比较的那个属性是你传入的比较器中来指定排序规则的那个属性)。

当然,我们也可以通过修改比较器中的compare方法,让元素的排序规则由多个属性的值来决定,那么只要这些属性的值中有一个不同,那么就可以加入成功,但如果都相同的话,还是不能加入成功。测试代码只修改了下面这一行

TreeSet<User> userSet = new TreeSet<>(new User.UserCompForAgeAndName());

具体如下:

public static void main(String[] args) { //此处传入的是根据age,name来排序的,所以后面加入的user中, // 如果集合中有元素的age和name值都与要加入的元素的值相同的话,就加入不了集合中 TreeSet<User> userSet = new TreeSet<>(new User.UserCompForAgeAndName()); userSet.add(new User(18, "zhang")); userSet.add(new User(58, "li")); userSet.add(new User(28, "wang")); userSet.add(new User(28, "wang")); userSet.add(new User(68, "wang")); userSet.add(new User(18, "qian")); userSet.add(new User(18, "wu")); for (User u : userSet) { System.out.println(u.toString()); } }

输出如下,我们可以看出,代码中先后加入了两个age=28, name=“wang”的元素,但只成功加入了第一个。而单独的name或age相同的元素,我们都能加入多个。

2、自定义类实现Comparable接口(让元素自身具有比较性)  

首先,我们编写我们的测试方法如下:

public static void main(String[] args) { TreeSet<User> userSet = new TreeSet<>(); userSet.add(new User(18, "zhang")); userSet.add(new User(58, "li")); userSet.add(new User(28, "wang")); userSet.add(new User(68, "wang")); userSet.add(new User(18, "qian")); userSet.add(new User(18, "wu")); for (User u : userSet) { System.out.println(u.toString()); } }

 然后编写我们的User类,此处实现了Comparable接口,需要重写compareTo方法,然后在该方法中实现我们自定义的比较逻辑。同样的,集合中不能有相同的决定我们排序规则的属性值。具体代码如下:

static class User implements Comparable{ int age; String name; User(){} User(int age, String name) { this.age = age; this.name = name; } public String toString(){ return "姓名:" + name + ", 年龄:" + age; } @Override //根据age升序,age相同的根据name降序排序,重复的age和name会加入集合失败 public int compareTo(Object o) { User u = (User) o; if (age == u.age) return u.name.compareTo(name); return age - u.age; }// @Override// //根据name降序排序,重复的name会加入集合失败// public int compareTo(Object o) {// User u = (User) o;// return u.name.compareTo(name);// }// @Override// //根据age升序排序,重复的age会加入集合失败// public int compareTo(Object o) {// User u = (User) o;// return age - u.age;// } }

运行结果如下:

 此处我们使用的是根据age升序,age相同的根据name降序来排序的,所以测试代码中add了两个age=28, name="wang"的对象,可加入集合的只有一个。当然也可以根据单独的age或那么来制定排序规则,实现方法如User类中的注释代码所示。运行结果与定义Comparator类的类似,此处就不重复演示了。有兴趣的读者可以自己运行一下以增加理解和印象。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。