ZetCode

Java Collections.min 方法

上次修改时间:2025 年 4 月 20 日

Collections.min 方法是 Java 的 java.util.Collections 类中的一个实用方法。它根据自然顺序返回给定集合的最小元素。该集合必须实现 Comparable 接口。

该方法有两个重载版本。一个使用自然顺序,另一个接受 Comparator 用于自定义排序。如果集合为空,两者都会抛出异常。

Collections.min 方法概述

min 方法扫描整个集合以找到最小的元素。对于自然顺序,元素必须实现 Comparable。如果集合为空,该方法会抛出 NoSuchElementException

带有 Comparator 的版本允许自定义排序逻辑。当元素没有实现 Comparable 或者你需要与自然顺序不同的排序时,这很有用。两种方法的时间复杂度都是线性的。

基本用法:数字

此示例演示了 Collections.min 与数字列表的最简单用法。数字实现了 Comparable,因此它们可以自然地比较。该示例演示了如何在列表中找到最小值。

MinWithNumbers.java
package com.zetcode;

import java.util.Collections;
import java.util.List;

public class MinWithNumbers {

    public static void main(String[] args) {

        List<Integer> numbers = List.of(34, 12, 56, 7, 23, 89);

        Integer min = Collections.min(numbers);

        System.out.println("Numbers: " + numbers);
        System.out.println("Minimum number: " + min);
    }
}

此代码创建一个整数列表,并使用 Collections.min 找到最小的整数。使用整数的自然顺序,因此 7 被正确识别为最小值。输出显示了原始列表和找到的最小值。

该示例演示了元素实现 Comparable 且自然顺序足够的最直接情况。

查找最小字符串

字符串也实现了 Comparable,允许基于字典顺序比较的自然排序。此示例在集合中找到按字母顺序排列的第一个字符串。比较是区分大小写的。

MinWithStrings.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MinWithStrings {

    public static void main(String[] args) {
        
        List<String> words = new ArrayList<>();
        words.add("zebra");
        words.add("apple");
        words.add("banana");
        words.add("cherry");
        
        String minWord = Collections.min(words);
        
        System.out.println("Words: " + words);
        System.out.println("First word alphabetically: " + minWord);
    }
}

代码创建一个字符串列表,并找到按字典顺序排列的最小字符串。“apple”被返回,因为它在字典顺序中排在最前面。字符串比较基于字符的 Unicode 值。

请注意,大写字母的 Unicode 值小于小写字母。对于不区分大小写的比较,我们需要一个自定义的 Comparator

使用自定义比较器

此示例展示了如何将 Collections.min 与自定义 Comparator 一起使用。我们通过比较字符串长度来查找列表中最短的字符串。比较器定义了排序逻辑。

MinWithComparator.java
package com.zetcode;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MinWithComparator {

    public static void main(String[] args) {

        List<String> words = List.of(
                "elephant", "cat", "giraffe", "dog", "hippopotamus");

        // Comparator comparing by string length
        Comparator<String> byLength = Comparator.comparingInt(String::length);

        String shortest = Collections.min(words, byLength);

        System.out.println("Words: " + words);
        System.out.println("Shortest word: " + shortest);
    }
}

在这里,我们使用一个 Comparator,它按长度比较字符串。min 方法使用此比较器来查找最短的字符串。“cat”和“dog”都是最短的,但“cat”出现在列表的最前面。

这演示了在自然顺序不合适时如何自定义比较逻辑。比较器可以实现任何所需的比较规则。

查找最小自定义对象

对于自定义对象,我们可以实现 Comparable 或提供 Comparator。此示例使用一个简单的 Person 记录展示了这两种方法。我们找到最年轻的人。

MinWithCustomObjects.java
package com.zetcode;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

record Person(String name, int age) implements Comparable<Person> {
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

public class MinWithCustomObjects {

    public static void main(String[] args) {

        List<Person> people = List.of(
                new Person("Alice", 25),
                new Person("Bob", 20),
                new Person("Charlie", 30)
        );

        // Using natural ordering (Comparable)
        Person youngestNatural = Collections.min(people);
        System.out.println("Youngest (natural): " + youngestNatural);

        // Using custom Comparator
        Person youngestComparator = Collections.min(people,
                Comparator.comparingInt(Person::age));
        System.out.println("Youngest (comparator): " + youngestComparator);
    }
}

Person 记录根据年龄实现 Comparable,从而实现自然排序。我们演示了使用自然排序和自定义比较器查找最年轻的人。在这种情况下,两种方法都产生相同的结果。

此示例展示了在使用 Collections.min 时如何处理自定义对象。在 ComparableComparator 之间进行选择取决于设计要求。

处理空集合

当在空集合上调用 Collections.min 时,会抛出 NoSuchElementException。此示例演示了适当的错误处理,以防止在集合可能为空时崩溃。

MinWithEmptyCollection.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;

public class MinWithEmptyCollection {

    public static void main(String[] args) {
        
        List<Integer> numbers = new ArrayList<>();
        
        try {
            Integer min = Collections.min(numbers);
            System.out.println("Minimum: " + min);
        } catch (NoSuchElementException e) {
            System.out.println("Cannot find minimum in empty collection");
            System.out.println("Error: " + e.getMessage());
        }
        
        // Safe alternative with Optional
        numbers.add(42); // Add an element
        numbers.stream().min(Integer::compareTo)
            .ifPresentOrElse(
                min -> System.out.println("Minimum: " + min),
                () -> System.out.println("Collection is empty")
            );
    }
}

该示例首先尝试在空列表中找到最小值,这会抛出异常。我们优雅地捕获并处理了此异常。然后,我们展示了一种使用 StreamOptional 的现代替代方法,该方法避免了异常。

当处理 Collections.min 时,适当的错误处理至关重要,因为空集合在实际应用中很常见。流方法提供了一种更具功能性的替代方法。

来源

Java Collections.min 文档

在本文中,我们深入探讨了 Java Collections.min 方法。我们涵盖了数字和字符串的基本用法、自定义比较器和错误处理。此方法是查找集合中最小元素的强大工具。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员。我于 2007 年开始撰写编程文章,至今已撰写了 1400 多篇文章和 8 本电子书。凭借超过 8 年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程