Java 将ArrayList排序为对象类型,然后按字母顺序排序
我已经定义了一个arrayList 每个对象都有自己的名称等。 我想把它们按类型分类,这样所有的西瓜都在一起,梨都在一起等等。然后在每个时间内按字母顺序对它们进行分类 使用Java 将ArrayList排序为对象类型,然后按字母顺序排序,java,sorting,arraylist,Java,Sorting,Arraylist,我已经定义了一个arrayList 每个对象都有自己的名称等。 我想把它们按类型分类,这样所有的西瓜都在一起,梨都在一起等等。然后在每个时间内按字母顺序对它们进行分类 使用 public int compare(String[] first, String[] second) { return first[1].compareTo(second[1]); } 也可以只在已创建的类中执行此操作,以避免在新类中执行此操作。关闭,但您将无法将字符串数组作为参数传递给比较方法。您需要创建一个比
public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
也可以只在已创建的类中执行此操作,以避免在新类中执行此操作。关闭,但您将无法将
字符串
数组作为参数传递给比较方法。您需要创建一个比较器
,参数将是食品
参考
然后在
compare(Food f1,Food f2)
方法中,您需要比较类,如果它们相同,则比较名称。关闭,但您将无法将String
数组作为参数传递给compare方法。您需要创建一个比较器
,参数将是食品
参考
然后在
compare(Food f1,Food f2)
方法中,您需要比较类,如果它们相同,则比较名称。您非常接近。您可以这样做(只需一次匿名实现Comparator
接口,就不需要新类):
Collections.sort(foodList,newcomparator(){
@凌驾
公共整数比较(食品1、食品2){
int结果=0;
if(food1.getType().equals(food2.getType())){
结果=food1.getName().compareTo(food2.getName());
}否则{
结果=food1.getType().compareTo(food2.getType());
}
返回结果;
}
});
另一种方法是让Food
实现compariable
,并对comparieto(to)
实现使用相同的逻辑
比较首先检查食物类型是否相等(假设食物类型具有适用的
equals()
方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食物类型进行比较。您非常接近。您可以这样做(只需一次匿名实现Comparator
接口,就不需要新类):
Collections.sort(foodList,newcomparator(){
@凌驾
公共整数比较(食品1、食品2){
int结果=0;
if(food1.getType().equals(food2.getType())){
结果=food1.getName().compareTo(food2.getName());
}否则{
结果=food1.getType().compareTo(food2.getType());
}
返回结果;
}
});
另一种方法是让Food
实现compariable
,并对comparieto(to)
实现使用相同的逻辑
比较首先检查食物类型是否相等(假设食物类型具有适用的
equals()
方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食品类型进行比较。您可以在食品
实现或子类中实现可比
接口。尽管编写一个适用于您的案例的实现很容易,但它并不像编写一个完全正确的可比的实现那样简单,特别是在继承方面。有关需求和常见缺陷的详细文档,请参见有效Java,第12项。您可以在食品实现或子类中实现可比接口。尽管编写一个适用于您的案例的实现很容易,但它并不像编写一个完全正确的可比的实现那样简单,特别是在继承方面。有关需求和常见缺陷的详细文档,请参见有效Java,第12项。您的比较方法名称错误。它将与可比接口进行比较:
public int compareTo(Fruit second) {
return this.getWaterMelon().compareTo(second.getWaterMelon());
}
您的比较方法名称错误。它将与可比接口进行比较:
public int compareTo(Fruit second) {
return this.getWaterMelon().compareTo(second.getWaterMelon());
}
我想说的是,您的compare()
方法需要为您的类型compareTo()差异+name
compareTo()差异返回加权值。
差不多
public int compare(Food food1, Food food2) {
int result = 0;
result = food1.getType().compareTo(food2.getType()) * someMultiplier + food1.getName().compareTo(food2.getName());
return result;
}
编辑:
这就是我建议的用法
public class ComparatorTest {
static class ComaparableObject implements Comparable {
private Object value1;
private Object value2;
public ComaparableObject(Object value1, Object value2) {
this.value1 = value1;
this.value2 = value2;
}
@Override
public int compareTo(Object o) {
int multiplier = 65535;
ComaparableObject co = (ComaparableObject) o;
int result = (value1.hashCode() * multiplier + value2.hashCode()) - (co.value1.hashCode() * multiplier + co.value2.hashCode()) ;
return result;
}
public Object getValue1() {
return value1;
}
public void setValue1(Object value1) {
this.value1 = value1;
}
public Object getValue2() {
return value2;
}
public void setValue2(Object value2) {
this.value2 = value2;
}
public String toString() {
String result = "value1=" + value1 + ", " + "value2=" + value2;
return result;
}
}
public static void main(String[] args) {
ArrayList<ComaparableObject> al;
al = new ArrayList<ComaparableObject>();
ComaparableObject co;
int value1 = 2;
co = new ComaparableObject(value1, 3);
al.add(co);
co = new ComaparableObject(value1, 1);
al.add(co);
co = new ComaparableObject(value1, 2);
al.add(co);
value1 = 1;
co = new ComaparableObject(value1, 3);
al.add(co);
co = new ComaparableObject(value1, 1);
al.add(co);
co = new ComaparableObject(value1, 2);
al.add(co);
System.out.println("Before sort: " + al);
Collections.sort(al, new Comparator<ComaparableObject>() {
@Override
public int compare(ComaparableObject co1, ComaparableObject co2) {
int result;
result = co1.compareTo(co2);
return result;
}
});
System.out.println("After sort: " + al);
}
}
公共类比较测试{
静态类ComaparableObject实现了可比较的{
私人物品价值1;
私人物品价值2;
public ComaparableObject(对象值1,对象值2){
此值为1.value1=value1;
此参数为0.value2=value2;
}
@凌驾
公共整数比较对象(对象o){
整数乘数=65535;
ComaparableObject co=(ComaparableObject)o;
int result=(value1.hashCode()*乘数+value2.hashCode())-(co.value1.hashCode()*乘数+co.value2.hashCode());
返回结果;
}
公共对象getValue1(){
返回值1;
}
public void setValue1(对象值1){
此值为1.value1=value1;
}
公共对象getValue2(){
返回值2;
}
public void setValue2(对象值2){
此参数为0.value2=value2;
}
公共字符串toString(){
字符串结果=“value1=“+value1+”,“+”value2=“+value2;
返回结果;
}
}
公共静态void main(字符串[]args){
ArrayList al;
al=新的ArrayList();
科马帕拉布勒公司;
整数值1=2;
co=新的ComaparableObject(值1,3);
al.add(co);
co=新的ComaparableObject(值1,1);
al.add(co);
co=新的ComaparableObject(值1,2);
al.add(co);
值1=1;
co=新的ComaparableObject(值1,