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

时间:2019-01-17 12:45:17

标签: java list sorting sortedlist

我在学校里有一项作业,其中一项要求是要列出狗的分类清单。我已经在代码中完成了除此要求之外的所有操作,因为我不确定该怎么做。在下方,您可以看到这部分作业的说明:

7命令:“列出狗” 该命令包含在您在提交第四步中提交的程序中,但是要求有所变化。更改的是,必须对列表进行排序,所有者必须在打印输出中在场,并且如果没有注册狗,则应该出现错误消息。 此命令列出注册表中的狗。用户必须询问有关最小尾巴长度的问题,程序必须在狗窝中打印所有尾巴长度与该最小尾巴长度相同或更长的狗的列表。如果输入0,则将打印所有狗。如果改为指定10,则仅写入尾长大于或等于10的狗。 打印时,必须打印所有狗的属性和尾巴长度。这包括该程序版本中的可能所有者。该列表应按尾巴长度排序。如果两条狗的尾巴长度相同,则必须按名称排序。

示例:列出狗 命令>列出狗 显示的最小尾巴长度> 1 以下狗的尾巴这么大: * Fido(腊肠犬,1年,2公斤,3.70厘米尾巴) *卡罗(斗牛犬,8岁,7公斤,尾巴5.60厘米,亨里克拥有) * Milou(梗犬,7年,8公斤,尾巴5.60厘米)

如果没有登记的狗,那么应该没有最小尾巴长度的问题。而是应打印一条错误消息。确保错误消息中包含“错误”或“错误”一词,否则测试程序无法识别这是一条错误消息。 示例:列出狗 命令>列出狗 错误:登记中没有狗

这是我的“清单犬”代码

    private void listDogs() {
    System.out.print("Smallest tail length to display: ");
    kennelList.sort(Comparator.comparing(dog -> dog.getName()));
    double tailLength = input.nextDouble();
    input.nextLine();
    int y = 0;
    while (y < kennelList.size()) {

        Dog dTail = kennelList.get(y);
        if (dTail.getTailLength() >= tailLength) {
            System.out.println(dTail);
        }
        y++;
    }
}

2 个答案:

答案 0 :(得分:1)

// define comparators
final Comparator<Dog> SORT_BY_NAME_ASC = Comparator.comparing(Dog::getName);
final Comparator<Dog> SORT_BY_TAIL_LENGTH_ASC = Comparator.comparing(Dog::getTailLength);

// define a list
List<Dog> kennelList = Collections.emptyList();

// sort list items (you can swap comparators)
kennelList.sort(SORT_BY_NAME_ASC.thenComparing(SORT_BY_TAIL_LENGTH_ASC));

// retrieve items with at least required tailLength
public static List<Dog> filterByTailLength(List<Dog> kennelList, double tailLength) {
    return kennelList.stream()
            .filter(dog -> Double.compare(dog.getTailLength(), tailLength) >= 0)
            .collect(Collectors.toList());
}

答案 1 :(得分:0)

以下四个步骤可以为您提供帮助,该方法使用Java 8 Stream API

  • 检查狗列表,如果为空或为空,则显示错误消息
  • 对狗名单进行排序
  • 过滤狗列表以找到目标狗
  • 打印狗的信息

假设狗的结构是这样的:

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));
}

如果始终使用排序的狗列表,则必须存储排序的狗列表,因此不必每次都进行排序。