【问题标题】:Get a specific maximum element from a collection with objects从包含对象的集合中获取特定的最大元素
【发布时间】:2017-12-10 04:57:39
【问题描述】:

我有一个 ArrayList,里面有对象,比如:

private static List<Movies> movie= new ArrayList<Movies>();

而构造函数是:(其中“类型”是一个枚举)

public Movies(String name, int budget, int a, String director, Type action)

现在我知道如何获取完整的第一个对象了:

Movies firstelement = movie.get(0);

但我想知道哪部电影的预算最高,然后打印它的导演。我怎么能这样做?

【问题讨论】:

标签: java object arraylist collections max


【解决方案1】:

假设Movies 有一个getBudget 方法返回预算, 你可以得到电影流, 按预算降序排列, 并找到第一个匹配项(如果有):

Movies first = movie.stream()
  .sorted(Comparator.comparing(Movies::getBudget).reversed())
  .findFirst()
  .orElseThrow(() -> new IllegalStateException("List of movies is empty!"));

如果您只想获取导演,可以在.sorted(...) 之后使用.map(...) 提取它。

【讨论】:

    【解决方案2】:

    用老式的方法怎么样:浏览列表并跟踪您迄今为止看过的最高预算的电影。当您看过列表中的所有电影后,您就会知道哪一部的预算最高。

    这是一种方法:

    Movie largestBudgetMovie = null;
    for (Movie m : movie) {
        if (largestBudgetMovie == null ||
            m.getBudget() > largestBudgetMovie.getBudget())
              largestBudgetMovie = m; 
    }
    if (largestBudgetMovie == null)
        System.out.println("The list was empty");
    else 
        System.out.println("The most expensive movie on my list was directed by " +
            largestBudgetMovie.getDirector());
    

    这是另一个:

    if (movie.size() > 0) {
        Movie largestBudgetMovie = movie.get(0);
        for (int i = 1; i < movie.size(); ++i) {
            Movie m = movie.get(i);
            if (m.getBudget() > largestBudgetMovie.getBudget())
                  largestBudgetMovie = m; 
        }       
        System.out.println("The most expensive movie on my list was directed by " +
            largestBudgetMovie.getDirector());
    }
    else 
        System.out.println("The list was empty"); 
    

    【讨论】:

    • 谢谢,这就是我要找的
    【解决方案3】:

    您只需要通过执行以下操作对列表进行排序

    列出电影 = movie.stream().sorted(Comparator.comparing(Movie::getBudget()));

    在此行之后执行此操作

    movies.get(0);
    

    【讨论】:

    • 首先,comparing(Movie::getBudget()) 不会编译;它应该是comparing(Movie::getBudget)。其次,表达式实际上并没有对movie 进行排序;结果是所有电影都按排序顺序排列的流,但实际列表movie 保持不变。所以movie.get(0) 之后只返回列表中已经(并且仍然是)第一的电影。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多