> 文章列表 > java8 校验list里元素是连续的工具类

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

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<Integer> list) {// 判断列表是否为空或只包含一个元素if (list == null || list.isEmpty() || list.size() == 1) {return true;}// 对列表进行排序List<Integer> 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<Integer> 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<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);List<Integer> list2 = Arrays.asList(1, 3, 4, 5, 6);List<Integer> list3 = Arrays.asList(1, 2, 4, 5, 6);List<Integer> list4 = Arrays.asList(1, 2, 3, 5, 6);List<Integer> list5 = Arrays.asList(1);List<Integer> list6 = null;System.out.println(ListValidator.isConsecutive(list1)); // trueSystem.out.println(ListValidator.isConsecutive(list2)); // falseSystem.out.println(ListValidator.isConsecutive(list3)); // falseSystem.out.println(ListValidator.isConsecutive(list4)); // falseSystem.out.println(ListValidator.isConsecutive(list5)); // trueSystem.out.println(ListValidator.isConsecutive(list6)); // true}
}

修改工具类的入参为 List<String>

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;public class ListValidator {public static boolean isConsecutive(List<String> list) {// 判断列表是否为空或只包含一个元素if (list == null || list.isEmpty() || list.size() == 1) {return true;}// 将字符串列表转换为整数列表List<Integer> intList = list.stream().map(Integer::parseInt).collect(Collectors.toList());// 对整数列表进行排序List<Integer> 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<Integer>改为了List<String>。在方法实现中,首先通过map()方法将字符串列表转换为整数列表,然后再对整数列表进行排序和比较操作。

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

List<String> 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<String> list1 = Arrays.asList("1", "2", "3", "4", "5");List<String> list2 = Arrays.asList("1", "3", "4", "5", "6");List<String> list3 = Arrays.asList("1", "2", "4", "5", "6");List<String> list4 = Arrays.asList("1", "2", "3", "5", "6");List<String> list5 = Arrays.asList("1");List<String> list6 = null;System.out.println(ListValidator.isConsecutive(list1)); // trueSystem.out.println(ListValidator.isConsecutive(list2)); // falseSystem.out.println(ListValidator.isConsecutive(list3)); // falseSystem.out.println(ListValidator.isConsecutive(list4)); // falseSystem.out.println(ListValidator.isConsecutive(list5)); // trueSystem.out.println(ListValidator.isConsecutive(list6)); // true}
}

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

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