java8 校验list里元素是连续的工具类

以下是一个 Java 8 校验 List 中数字是否连续的工具类:

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ListValidator {
    
    public static boolean isConsecutive(List list) {
        // 判断列表是否为空或只包含一个元素
        if (list == null || list.isEmpty() || list.size() == 1) {
            return true;
        }
        
        // 对列表进行排序
        List sortedList = list.stream().sorted().collect(Collectors.toList());
        
        // 使用IntStream创建一段连续的整数序列
        IntStream range = IntStream.range(sortedList.get(0), sortedList.get(sortedList.size() - 1) + 1);
        
        // 将排序后的列表中的元素与生成的连续整数序列逐个比较
        return range.allMatch(sortedList::contains);
    }
}

上述代码实现了一个名为ListValidator的工具类,其中的isConsecutive方法用于校验传入的列表中的数字是否连续。该方法的实现过程如下:

首先,判断传入的列表是否为空或只包含一个元素,如果是,则直接返回true。因为一个空列表或只有一个元素的列表,其内部的数字一定是连续的。

然后,对列表进行排序,这样可以减少后续的比较操作次数。使用Java 8的流式API中的sorted()方法可以方便地对列表进行排序。

接着,使用IntStream.range()方法创建一个包含指定范围内连续整数的序列。其中,sortedList.get(0)sortedList.get(sortedList.size() - 1)分别表示列表中最小值和最大值。

最后,使用allMatch()方法将排序后的列表中的元素与生成的连续整数序列逐个比较,如果全部匹配,则说明列表中的数字是连续的。

使用该工具类的示例:

List yourList = ... // 待校验的列表

if (ListValidator.isConsecutive(yourList)) {
    System.out.println("列表中的数字是连续的");
} else {
    System.out.println("列表中的数字不连续");
}

需要注意的是,在实际应用中,还需要根据业务需求进行异常处理等操作,以确保程序的正确性和健壮性。

以下是一个测试用例,用于验证上述 Java 8 校验 List 中数字是否连续的工具类实现的正确性:

import java.util.Arrays;
import java.util.List;

public class ListValidatorTest {
    
    public static void main(String[] args) {
        List list1 = Arrays.asList(1, 2, 3, 4, 5);
        List list2 = Arrays.asList(1, 3, 4, 5, 6);
        List list3 = Arrays.asList(1, 2, 4, 5, 6);
        List list4 = Arrays.asList(1, 2, 3, 5, 6);
        List list5 = Arrays.asList(1);
        List list6 = null;
        
        System.out.println(ListValidator.isConsecutive(list1)); // true
        System.out.println(ListValidator.isConsecutive(list2)); // false
        System.out.println(ListValidator.isConsecutive(list3)); // false
        System.out.println(ListValidator.isConsecutive(list4)); // false
        System.out.println(ListValidator.isConsecutive(list5)); // true
        System.out.println(ListValidator.isConsecutive(list6)); // true
    }
}

修改工具类的入参为 List

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ListValidator {

    public static boolean isConsecutive(List list) {
        // 判断列表是否为空或只包含一个元素
        if (list == null || list.isEmpty() || list.size() == 1) {
            return true;
        }

        // 将字符串列表转换为整数列表
        List intList = list.stream().map(Integer::parseInt).collect(Collectors.toList());

        // 对整数列表进行排序
        List sortedList = intList.stream().sorted().collect(Collectors.toList());

        // 使用IntStream创建一段连续的整数序列
        IntStream range = IntStream.range(sortedList.get(0), sortedList.get(sortedList.size() - 1) + 1);

        // 将排序后的列表中的元素与生成的连续整数序列逐个比较
        return range.allMatch(sortedList::contains);
    }
}

上述代码与之前的示例基本相同,只是将入参类型由List改为了List。在方法实现中,首先通过map()方法将字符串列表转换为整数列表,然后再对整数列表进行排序和比较操作。

使用该工具类的示例如下:

List yourList = ... // 待校验的字符串列表

if (ListValidator.isConsecutive(yourList)) {
    System.out.println("列表中的数字是连续的");
} else {
    System.out.println("列表中的数字不连续");
}

以下是一个测试用例,用于验证上述 Java 8 校验 List 中字符串是否连续的工具类实现的正确性:

import java.util.Arrays;
import java.util.List;

public class ListValidatorTest {

    public static void main(String[] args) {
        List list1 = Arrays.asList("1", "2", "3", "4", "5");
        List list2 = Arrays.asList("1", "3", "4", "5", "6");
        List list3 = Arrays.asList("1", "2", "4", "5", "6");
        List list4 = Arrays.asList("1", "2", "3", "5", "6");
        List list5 = Arrays.asList("1");
        List list6 = null;

        System.out.println(ListValidator.isConsecutive(list1)); // true
        System.out.println(ListValidator.isConsecutive(list2)); // false
        System.out.println(ListValidator.isConsecutive(list3)); // false
        System.out.println(ListValidator.isConsecutive(list4)); // false
        System.out.println(ListValidator.isConsecutive(list5)); // true
        System.out.println(ListValidator.isConsecutive(list6)); // true
    }
}

在上述代码中,定义了6个列表,分别对应了不同的情况。通过调用ListValidator.isConsecutive()方法对这些列表进行校验,并打印校验结果,以验证工具类的正确性。

需要注意的是,在实际应用中,还需要针对不同的业务需求编写不同的测试用例,以确保程序的正确性和健壮性。

你可能感兴趣的:(java,java工具类)