【问题标题】:How to make a sorted list in java?如何在java中制作排序列表?
【发布时间】:2019-01-17 12:45:17
【问题描述】:

我在学校有一项任务,其中一项要求是对狗进行排序。除了这个要求,我已经在我的代码中完成了所有工作,因为我不知道该怎么做。下面你可以看到这部分作业的描述:

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

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

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

这是我的“列出狗”的代码

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

【问题讨论】:

  • @Echoinacup 不需要,她已经有了这个Comparator.comparing(dog -&gt; dog.getName())
  • @m0skit0 抱歉,我赶时间发表评论。
  • 基于您在 kennelList 上使用 while 进行迭代:在您的 while 循环之外声明一个新 List,根据您的尾长条件将 Dog 添加到列表中,最后 - 对在尾部长度上使用比较器列出。
  • 不应该是Comparators.comparingInt(Dog::getTailLength).thenComparing(Dog::getName)
  • @strelok 是的!当我改为那个时,问题就解决了......非常感谢!忘了包括尾巴长度

标签: java list sorting sortedlist


【解决方案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());
}

【讨论】:

  • 应该是尾长,然后是名字。
【解决方案2】:

以下四个步骤可以帮助你,方法使用Java 8 Stream API

  • 检查狗列表,如果为空或为空则打印错误信息
  • 排序狗列表
  • 过滤狗列表以找到目标狗
  • 打印狗信息

假设 Dog 结构如下:

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

如果一直使用排序的狗列表,则必须存储排序的狗列表,所以不需要每次都排序。

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2018-02-16
    • 2021-12-25
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多