java list id排序_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...

策略模式:1.抽象策略类,通常由一个接口或者抽象类实现。 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用。

好了,上代码:

package execrise;

import java.util.List;

/**

* 接口

* @author Administrator

* 2013年5月2日 18:57:16

*/

public interface Strange

{

public void sort(List list,int i);

}

package execrise;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* 具体实现类

* @author Administrator

* 2013年5月2日 18:56:23

*/

public class FindByID implements Strange

{

public int k;

@Override

public void sort(List list, int i)

{

System.out.println("i==" + i);

if (i == 1)// j=1 倒序

{

this.k = i;

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else if (i == 0)// i=0 正序

{

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else

{

System.out.println("请输入0或者1(0代表正序,1代表倒序) ");

}

}

private class MyComparator implements Comparator

{

@Override

public int compare(Person o1, Person o2)

{

/*

* 我当时纳闷,我没有调用compare()方法,我们知道Collections.reverseOrder()括号里是一个指定的比较器,

* 可是我怎么确定我的compare()方法起作用,被调用呢???于是有了如下打印语句。证明确实调用了自己重写的方法。

* 那谁调用呢???? 一定是reverseOrder()这个方法。于是跟踪源码。如下: public static

* Comparator reverseOrder(Comparator cmp) { if (cmp == null)

* return reverseOrder(); return new ReverseComparator2(cmp); }    * 继续跟踪 ---> ReverseComparator2....源码如下:

*

* private static class ReverseComparator2 implements

* Comparator,Serializable { private static final long

* serialVersionUID = 4374092139857L; private Comparator cmp;

*

* ReverseComparator2(Comparator cmp) { assert cmp != null;

* this.cmp = cmp; }

*

* public int compare(T t1, T t2) { return cmp.compare(t2, t1); } }    *

* 知道ReverseComparator2是个内部类,注意这句话 return cmp.compare(t2,

* t1);这句就是调用我们自己的compare()方法。呵呵,低调低调。。。    */

System.out.print("1" + " ");

if (k == 0)

{

System.out.print("2" + " ");

return o2.getId() - o1.getId();/* 因为正序,所以根据第一个参数大于第二个参数返回正整数。 */

}

else

{

System.out.print("3" + " ");

return o1.getId() - o2.getId();/*比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。*/

}

}

}

}

package execrise;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

*

* @author Administrator 2013年5月2日 18:57:55

*/

public class FindByName implements Strange

{

int k;

@Override

public void sort(List list, int i)

{

if (i == 1)// j=1 倒序

{

this.k = i;

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else if (i == 0)// i=0 正序

{

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else

{

System.out.println("请输入0或者1(0代表正序,1代表倒序) ");

}

}

private class MyComparator implements Comparator

{

@Override

public int compare(Person o1, Person o2)

{

if (k == 0)

{

return o2.getName().compareTo(o1.getName());

}

else

{

return o1.getName().compareTo(o2.getName());

}

}

}

}

package execrise;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* @author Administrator

* 2013年5月2日 18:58:27

*/

public class FindByAge implements Strange

{

int k;

@Override

public void sort(List list, int i)

{

if (i == 1)// j=1 倒序

{

this.k = i;

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else if (i == 0)// i=0 正序

{

Collections

.sort(list, Collections.reverseOrder(new MyComparator()));

}

else

{

System.out.println("请输入0或者1(0代表正序,1代表倒序) ");

}

}

private class MyComparator implements Comparator

{

@Override

public int compare(Person o1, Person o2)

{

if (k == 0)

{

return o2.getAge() - o1.getAge();

}

else

{

return o1.getAge() - o2.getAge();

}

}

}

}

package execrise;

import java.util.List;

/**

* 2013年5月2日 18:59:12

*

* @author Administrator

*

*/

public class Envrioment

{

Envrioment()

{

}

Envrioment(Strange strange)

{

this.strange = strange;

}

private Strange strange;

public Strange getStrange()

{

return strange;

}

public void setStrange(Strange strange)

{

this.strange = strange;

}

public void invoke(List list, int i)

{

strange.sort(list, i);

}

}

package execrise;

import java.util.ArrayList;

/**

* 2013年5月2日 19:01:02

* @author Administrator

* 客户端

*/

public class Client

{

public static void main(String[] args)

{

ArrayList list = new ArrayList();

Person p1 = new Person(1, "a", 34);

Person p2 = new Person(2, "b", 24);

Person p3 = new Person(3, "c", 24);

Person p4 = new Person(4, "bb", 24);

Person p5 = new Person(5, "ba", 24);

Person p6 = new Person(6, "d", 24);

Person p7 = new Person(7, "d", 24);

Person p8 = new Person(8, "d", 25);

Person p9 = new Person(9, "d", 25);

list.add(p1);

list.add(p2);

list.add(p3);

list.add(p4);

list.add(p5);

list.add(p6);

list.add(p7);

list.add(p8);

list.add(p9);

Envrioment e = new Envrioment();

e.setStrange(new FindByID());

int i = 0;// i=0 正序

int j = 1;// j=1 倒序

System.out.println("按照person id  正序排序");

e.invoke(list, i);

for(Person al:list)

{

System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());

}

System.out.println("按照person id  降序排序");

e.invoke(list, j);

for(Person a2:list)

{

System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());

}

System.out.println("按照person name  正序排序,如果name相同,按照id正序排序");

Envrioment e1 = new Envrioment(new FindByName());

e1.invoke(list, i);

for(Person al:list)

{

System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());

}

System.out.println("按照person name  降序排序,如果name相同,按照id正序排序");

e1.invoke(list, j);

for(Person a2:list)

{

System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());

}

System.out.println("按照person age  正序排序,如果age相同,按照id正序排序");

Envrioment e2 = new Envrioment(new FindByAge());

e2.invoke(list, i);

for (Person al : list)

{

System.out.println("id=" + al.getId() + " name=" + al.getName()

+ " age=" + al.getAge());

}

System.out.println("按照person age  降序排序,如果age相同,按照id正序排序");

e2.invoke(list, j);

for (Person a1 : list)

{

System.out.println("id=" + a1.getId() + " name=" + a1.getName()

+ " age=" + a1.getAge());

}

}

}

输出结果:

按照person id  正序排序

i==0

1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

id=1 name=a age=34

id=2 name=b age=24

id=3 name=c age=24

id=4 name=bb age=24

id=5 name=ba age=24

id=6 name=d age=24

id=7 name=d age=24

id=8 name=d age=25

id=9 name=d age=25

按照person id  降序排序

i==1

1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3

id=9 name=d age=25 id=8 name=d age=25 id=7 name=d age=24 id=6 name=d age=24 id=5 name=ba age=24 id=4 name=bb age=24 id=3 name=c age=24 id=2 name=b age=24 id=1 name=a age=34 按照person name  正序排序,如果name相同,按照id正序排序 id=1 name=a age=34 id=2 name=b age=24 id=5 name=ba age=24 id=4 name=bb age=24 id=3 name=c age=24 id=9 name=d age=25 id=8 name=d age=25 id=7 name=d age=24 id=6 name=d age=24 按照person name  降序排序,如果name相同,按照id正序排序 id=9 name=d age=25 id=8 name=d age=25 id=7 name=d age=24 id=6 name=d age=24 id=3 name=c age=24 id=4 name=bb age=24 id=5 name=ba age=24 id=2 name=b age=24 id=1 name=a age=34 按照person age  正序排序,如果age相同,按照id正序排序 id=7 name=d age=24 id=6 name=d age=24 id=3 name=c age=24 id=4 name=bb age=24 id=5 name=ba age=24 id=2 name=b age=24 id=9 name=d age=25 id=8 name=d age=25 id=1 name=a age=34 按照person age  降序排序,如果age相同,按照id正序排序 id=1 name=a age=34 id=9 name=d age=25 id=8 name=d age=25 id=7 name=d age=24 id=6 name=d age=24 id=3 name=c age=24 id=4 name=bb age=24 id=5 name=ba age=24 id=2 name=b age=24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,您可以使用`Comparator`和`Collectors.groupingBy()`来对列表进行按姓名分组,然后再按年龄排序。以下是实现该功能的示例代码: ```java import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupAndSort { public static void main(String[] args) { // 假设每个元素是一个Person对象,包含姓名年龄属性 List<Person> persons = new ArrayList<>(); persons.add(new Person("Alice", 25)); persons.add(new Person("Bob", 30)); persons.add(new Person("Alice", 20)); persons.add(new Person("Charlie", 35)); persons.add(new Person("Bob", 28)); // 按姓名分组 Map<String, List<Person>> groupedData = persons.stream() .collect(Collectors.groupingBy(Person::getName)); // 对每个分组按年龄排序 groupedData.values().forEach(group -> group.sort(Comparator.comparingInt(Person::getAge))); // 打印排序后的结果 for (List<Person> group : groupedData.values()) { for (Person person : group) { System.out.println(person); } } } static class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } } ``` 这段代码将列表中的元素按姓名分组,并对每个分组按年龄进行排序。您可以根据自己的需求修改代码中的数据结构和排序规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值