Java 按尾长和字母顺序排序列表

Java 按尾长和字母顺序排序列表,java,list,sorting,arraylist,Java,List,Sorting,Arraylist,我应该写一个排序列表的算法。 列表应按尾长排序。如果名单上的两只狗的尾巴长度相同,它们应该按字母顺序排列 我有一个名为getTailLength的方法,它返回狗的尾长。 到目前为止,我对排序算法的了解如下: public void sortByName(ArrayList allDogs){ 对于(int i=1;i=0&¤tDogName .compareTo(allDogs.get(j).getName())

我应该写一个排序列表的算法。 列表应按尾长排序。如果名单上的两只狗的尾巴长度相同,它们应该按字母顺序排列

我有一个名为getTailLength的方法,它返回狗的尾长。 到目前为止,我对排序算法的了解如下:

public void sortByName(ArrayList allDogs){
对于(int i=1;i=0&¤tDogName
.compareTo(allDogs.get(j).getName())<0){
allDogs.set(j+1,allDogs.get(j));
j--;
}
allDogs.set(j+1,currentDogName);
}
}
public void sortDogs(ArrayList allDogs){
对于(int i=1;iallDogs.get(j.getTailLength()){
集合。交换(所有狗,i,j);
}else if(currentMinTail==allDogs.get(i).getTailLength()){
sortByName(所有狗);
}
}
}
}
问题在于这行代码

allDogs.set(j+1,currentDogName);

我不确定这里要更改什么,因为它说Dog是必需的,但我比较的是字符串,而不是Dog,因为我比较的是名称?

您必须为
所有dogs.set(index,Dog)
提供一个Dog实例

你比较字符串,但你仍然对狗进行排序

您可以使用
allDogs.get(i).getName()获得
currentDogName
我不会在例程中更改,所以只需替换
allDogs.set(j+1,currentDogName)allDogs.set(j+1,allDogs.get(i))

总的来说,你的功能看起来很混乱。在助手函数“sortByName”中处理整个数组可能会导致错误

您应该执行以下操作之一:

  • 使用“Collections.sort()”和“Compariable”接口
  • 按尾部长度对数组排序,然后再次迭代以对具有相同尾部长度的所有狗进行排序

  • 您必须向
    allDogs.set(index,Dog)
    提供一个Dog实例

    你比较字符串,但你仍然对狗进行排序

    您可以使用
    allDogs.get(i).getName()获得
    currentDogName
    我不会在例程中更改,所以只需替换
    allDogs.set(j+1,currentDogName)allDogs.set(j+1,allDogs.get(i))

    总的来说,你的功能看起来很混乱。在助手函数“sortByName”中处理整个数组可能会导致错误

    您应该执行以下操作之一:

  • 使用“Collections.sort()”和“Compariable”接口
  • 按尾部长度对数组排序,然后再次迭代以对具有相同尾部长度的所有狗进行排序

  • 如果不是练习,正确的方法是将
    sortDogs()
    替换为以下单行:

    allDogs.sort(Comparator.comparingInt(Dog::getTailLength)
                           .thenComparing(Dog::getName));
    

    如果不是练习,正确的方法是将
    sortDogs()
    替换为以下单行:

    allDogs.sort(Comparator.comparingInt(Dog::getTailLength)
                           .thenComparing(Dog::getName));
    

    这看起来太复杂了。您是否考虑过使用Comaparable接口?因此,我想您可以使用dog对象本身,而不是创建
    字符串currentDogName
    ,但每次使用当前dog对象来比较其名称时,请使用
    currentDog.getName()
    因此,我想说,获取所有狗的所有尾巴长度,将其放入一个集合,对它进行排序,然后调用SortByName方法,认为这将使您的工作更容易。这看起来太复杂了。您是否考虑过使用Comaparable接口?因此,我想您可以使用dog对象本身,而不是创建
    字符串currentDogName
    ,但每次使用当前dog对象来比较其名称时,请使用
    currentDog.getName()
    因此,我想说,获取所有狗的所有尾巴长度,将其放入一个集合,对它进行排序,然后调用SortByName方法,认为这将使您的工作更轻松。