如何在java中创建排序列表?

如何在java中创建排序列表?,java,list,sorting,sortedlist,Java,List,Sorting,Sortedlist,我在学校有一个作业,其中一个要求是要有一个分类的狗名单。我已经在我的代码中做了所有的事情,除了这个要求,因为我不知道怎么做。下面您可以看到作业这一部分的说明: 7命令:“列出狗” 此命令包含在您在提交步骤4中提交的程序中,但在某种程度上改变了要求。改变的是,必须对列表进行排序,所有者必须出现在打印输出中,如果没有注册狗,则应该有一条错误消息。 此命令列出注册表中的狗。用户必须获得关于最小尾巴长度的问题,并且程序必须打印犬舍中所有尾巴长度与该最小长度相同或更长的狗的列表。如果输入0,则将打印所有狗

我在学校有一个作业,其中一个要求是要有一个分类的狗名单。我已经在我的代码中做了所有的事情,除了这个要求,因为我不知道怎么做。下面您可以看到作业这一部分的说明:

7命令:“列出狗” 此命令包含在您在提交步骤4中提交的程序中,但在某种程度上改变了要求。改变的是,必须对列表进行排序,所有者必须出现在打印输出中,如果没有注册狗,则应该有一条错误消息。 此命令列出注册表中的狗。用户必须获得关于最小尾巴长度的问题,并且程序必须打印犬舍中所有尾巴长度与该最小长度相同或更长的狗的列表。如果输入0,则将打印所有狗。如果指定10,则只写入尾巴长度大于或等于10的狗。 打印时,必须打印狗的所有属性和尾巴长度。这包括此版本程序中可能的所有者。列表应按尾部长度排序。如果两只狗有相同的尾巴长度,它们必须按名字排序

示例:列出狗 命令>列出狗 要显示的最小尾部长度>1 下面的狗有这么大的尾巴: *Fido(达克斯猎犬,1岁,2公斤,尾巴3.70厘米) *卡罗(斗牛犬,8岁,7公斤,5.60厘米尾巴,归亨里克所有) *麋鹿(梗,7岁,8公斤,尾巴5.60厘米)

如果没有狗登记,就不存在最小尾巴长度的问题。相反,应该打印一条错误消息。请确保错误消息包含“错误”或“错误”字样,否则测试程序无法识别它是错误消息。   示例:列出狗 命令>列出狗 错误:注册表中没有狗

这是我“列出狗”的代码

private void listDogs(){
System.out.print(“要显示的最小尾部长度:”);
sort(Comparator.comparing(dog->dog.getName());
双尾长度=input.nextDouble();
input.nextLine();
int y=0;
而(y=tailLength){
系统输出打印项次(dTail);
}
y++;
}
}
//定义比较器
最终比较器按名称排序(Dog::getName);
最终比较器按尾数排序长度(ASC=Comparator.comparing)(Dog::getTailLength);
//定义一个列表
List kennelList=Collections.emptyList();
//对列表项进行排序(您可以交换比较器)
kennelList.sort(按名称排序,然后比较(按尾部排序,长度排序));
//检索至少具有所需尾长的项目
公共静态列表筛选器ByTailLength(列表kennelList,双tailLength){
返回kennelList.stream()
.filter(dog->Double.compare(dog.getTailLength(),tailLength)>=0)
.collect(Collectors.toList());
}

以下四个步骤可以帮助您,该方法使用Java 8流API

  • 检查狗列表,如果为null或空,则打印错误消息
  • 分类狗名单
  • 筛选狗列表以查找目标狗
  • 打印狗信息
假设狗的结构如下:

class Dog {
    private String name;
    private Double tailLength;
    private String owner;
}
Java 8中的代码如下所示:

public static void listDogs(List<Dog> dogs, int tailLengh) {
    if (null == dogs || dogs.size() < 1) {
        System.out.println("no register dogs");
    } else dogs.stream()
            .sorted((o1, o2) -> o1.getTailLength().compareTo(o2.getTailLength()) == 0 ? o1.getName().compareTo(o2.getName()) : o1.getTailLength().compareTo(o2.getTailLength()))
            .filter(dog -> dog.getTailLength() >= tailLengh)
            .forEach(dog -> System.out.println(dog));
}
公共静态无效列表狗(列表狗,内部长度){
if(null==dogs | | dogs.size()<1){
System.out.println(“无注册狗”);
}其他狗
.sorted((o1,o2)->o1.getTailLength().compareTo(o2.getTailLength())==0?o1.getName().compareTo(o2.getName()):o1.getTailLength().compareTo(o2.getTailLength())
.filter(dog->dog.getTailLength()>=tailLengh)
.forEach(dog->System.out.println(dog));
}

如果总是使用已排序的狗列表,则您必须存储已排序的狗列表,这样就不必每次都进行排序。

@Echoinacup无需,她已经有了这个
比较器。比较(dog->dog.getName())
@m0skit0抱歉,我急忙给出了评论。基于您在kennelList上迭代了一段时间:在while循环之外声明一个新列表,在满足尾部长度条件的基础上向列表中添加一只狗,最后-使用尾部长度的比较器对列表进行排序。它不应该是
Comparators.comparingit(Dog::getTailLength)。然后进行比较吗(Dog::getName)
@strelok是的!当我改为该选项时,问题已经解决了…非常感谢!忘了包含尾部长度应该先是尾部长度,然后是名称。
class Dog {
    private String name;
    private Double tailLength;
    private String owner;
}
public static void listDogs(List<Dog> dogs, int tailLengh) {
    if (null == dogs || dogs.size() < 1) {
        System.out.println("no register dogs");
    } else dogs.stream()
            .sorted((o1, o2) -> o1.getTailLength().compareTo(o2.getTailLength()) == 0 ? o1.getName().compareTo(o2.getName()) : o1.getTailLength().compareTo(o2.getTailLength()))
            .filter(dog -> dog.getTailLength() >= tailLengh)
            .forEach(dog -> System.out.println(dog));
}