如何对java.util.ArrayList进行排序<;父类型>;基于儿童类型? 公共界面人机界面{} 公共阶级男子实行人权{ 公众人物(姓名){ this.firstName=firstName; } ..... } 公共阶级妇女实施人权{ 公共女性(字符串名){ this.firstName=firstName; } ..... } 公共类测试{ 公共静态void main(字符串[]args){ 列表工程师=新的ArrayList(); 工程师。增加(新增人员(“A”); 增加(新女性(A); 工程师。增加(新人员(“C”); 工程师。增加(新人员(“E”); 增加(新增人员(“Z”); 增加(新女性); 增加(新女性); 工程师。增加(新人员(“X”); 工程师。增加(新人员(“O”); 增加(新女性(“G”); 收集、分类(工程师); System.out.println(…打印工程师数组…) }
输出 男性(A);男性(C);男性(E);男性(O);男性(X);男性(Z)女性(A);女性(B); 妇女(G);妇女(AJ) 我的排序arraylist应该按照类型(男性或女性)进行如何对java.util.ArrayList进行排序<;父类型>;基于儿童类型? 公共界面人机界面{} 公共阶级男子实行人权{ 公众人物(姓名){ this.firstName=firstName; } ..... } 公共阶级妇女实施人权{ 公共女性(字符串名){ this.firstName=firstName; } ..... } 公共类测试{ 公共静态void main(字符串[]args){ 列表工程师=新的ArrayList(); 工程师。增加(新增人员(“A”); 增加(新女性(A); 工程师。增加(新人员(“C”); 工程师。增加(新人员(“E”); 增加(新增人员(“Z”); 增加(新女性); 增加(新女性); 工程师。增加(新人员(“X”); 工程师。增加(新人员(“O”); 增加(新女性(“G”); 收集、分类(工程师); System.out.println(…打印工程师数组…) },java,sorting,collections,enums,type-erasure,Java,Sorting,Collections,Enums,Type Erasure,输出 男性(A);男性(C);男性(E);男性(O);男性(X);男性(Z)女性(A);女性(B); 妇女(G);妇女(AJ) 我的排序arraylist应该按照类型(男性或女性)进行初始排序,而第二个排序基于firstname。我如何才能最好地实现这一点 我尝试了集合。排序(…) 不能得到想要的结果 提前感谢您需要使用a和集合。排序(列表l,比较器c) 静态最终比较器= 新比较器() { 公共整数比较(人e1、人e2) { //您的自定义比较代码位于此处 } }; 集合。排序(工程师、MyCo
初始排序,而第二个排序基于firstname
。我如何才能最好地实现这一点
我尝试了集合。排序(…)
不能得到想要的结果
提前感谢您需要使用a和集合。排序(列表l,比较器c)
静态最终比较器=
新比较器()
{
公共整数比较(人e1、人e2)
{
//您的自定义比较代码位于此处
}
};
集合。排序(工程师、MyComparator);
其他信息可通过有关对象排序的教程找到:
你可能是说
public interface Human extends Comparable<Human> {}
公共界面人机界面{}
也就是说:人与其他人具有可比性。在这种情况下,如果您希望根据类型和名称来比较人,那么您的界面人需要表示这两个属性:
public interface Human extends Comparable<Human> {
enum Type { MAN, WOMAN }
Type getType();
String getName();
}
公共界面人机界面{
枚举类型{男,女}
类型getType();
字符串getName();
}
然后编写一个适当的compareTo()
实现,同时考虑类型和名称,并使用Collections.sort()
进行排序。我建议使用“Comparator”接口。编写实现此接口的其他类。
然后在compare方法中编写相应的代码,检查实例,然后检查实例的成员。你们推荐这样做吗
public class HumanComparator implements java.util.Comparator<HumanBeings> {
@Override
public int compare(HumanBeings o1, HumanBeings o2) {
if(o1 instanceof Men && o2 instanceof Men)
return 0;
else if(o1 instanceof Men && o2 instanceof Women)
return -1;
else if (o1 instanceof Women && o2 instanceof Men)
return 1;
return 0;
}
}
公共类HumanComparator实现java.util.Comparator{
@凌驾
公共整数比较(人形o1,人形o2){
if(o1男性实例和o2男性实例)
返回0;
其他if(男性和女性o2实例o1实例)
返回-1;
else if(女性o1实例和男性o2实例)
返回1;
返回0;
}
}
..并添加更多代码以按名字进一步排序
基于Ryan Stewart的解决方案的比较器实现
。效果非常好
Collections.sort(engineers, new Comparator<Human>() {
@Override
public int compare(Human o1, Human o2) {
if(o1.getType().equals(o2.getType())) {
return o1.getFirstName().compareTo(o2.getFirstName());
} else {
return o1.getType().compareTo(o2.getType());
}
}
});
Collections.sort(工程师,新比较器(){
@凌驾
公共整数比较(人o1,人o2){
如果(o1.getType().equals(o2.getType())){
返回o1.getFirstName().compareTo(o2.getFirstName());
}否则{
返回o1.getType().compareTo(o2.getType());
}
}
});
或多或少,除非在这种情况下您不应该使用instanceof。您的Human
应该表示其“类型”,如中所述。
Collections.sort(engineers, new Comparator<Human>() {
@Override
public int compare(Human o1, Human o2) {
if(o1.getType().equals(o2.getType())) {
return o1.getFirstName().compareTo(o2.getFirstName());
} else {
return o1.getType().compareTo(o2.getType());
}
}
});
class HumanComparator implements Comparator<Human>{
@Override
public int compare(Human humanObj1, Human humanObj2) {
int index;
if(humanObj1 instanceof Men && humanObj2 instanceof Men){
String firstName1 = humanObj1.getFirstName();
String firstName2 = humanObj2.getFirstName();
index = firstName1.compareTo(firstName2);
}else if(humanObj1 instanceof Women && humanObj2 instanceof Women){
String firstName1 = humanObj1.getFirstName();
String firstName2 = humanObj2.getFirstName();
index = firstName1.compareTo(firstName2);
}else if(humanObj1 instanceof Men && humanObj2 instanceof Women){
index =-1;
}else if(humanObj1 instanceof Women && humanObj2 instanceof Men){
index =+1;
}else{
index =0;
}
return index;
}
Collections.sort(engineers ,new HumanComparator());