我有一个Java列表列表。这是代码:
@GetMapping(value = Constants.API_LOGIN)
public String login(@RequestParam String userName, @RequestParam String password) throws JSONException {
....
JSONObject json = new JSONObject();
json.put("status", true);
json.put("message", "login success");
return ResponseEntity.status(HttpStatus.OK).body(json.toString());
}
如何检查myList中存在的列表的长度是否相同?我知道我可以使用List<List<Integer>> myList = new ArrayList<>();
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.get(0).add(1);
myList.get(0).add(2);
myList.get(0).add(3);
myList.get(1).add(4);
myList.get(1).add(5);
myList.get(1).add(6);
myList.get(2).add(7);
myList.get(2).add(8);
myList.get(2).add(9);
之类的方法检查每个列表的长度,那么一种有效且简短的方法来检查所有这些列表的长度是否相同(而不是一个个地检查)?
答案 0 :(得分:8)
您可以通过将任何包含的列表大小(例如第一个)与所有其他包含的列表进行匹配来使用Stream.allMatch()
:
boolean isSameLength =
myList.stream()
.allMatch(l -> l.size() == myList.get(0).size())
它使第一个比较变得无助,因为它比较了相同的包含列表,但更容易理解:
boolean isSameLength =
myList.stream()
.skip(1)
.allMatch(l -> l.size() == myList.get(0).size())
答案 1 :(得分:2)
您不能希望说 n 个列表的长度相同而不访问它们。您必须一步一步走。 davidxxx的答案显示了使用流的一种非常不错的方法,但是无论如何都要访问所有列表。天真的方法可能是
public static boolean sameLength(List<List> lists){
if(lists.get(0) == null){ //EDIT: as davidxxx pointed out this if is superfluous
return true;
}
int len = lists.get(0).size();
for (List list : lists) {
if(list.size() != len){
return false;
}
}
return true;
}
我的IDE甚至建议对上面的代码使用函数运算符,例如davidxxx说。
答案 2 :(得分:1)
如果使用Java 8,则可以使用lambda表达式简化应用程序。看:
if (myList.stream().filter(integers -> integers.size() == myList.get(0).size()).count() == myList.size()) {
System.out.println("The sub-lists have the same size");
}
答案 3 :(得分:0)
您还可以使用计数器变量进行检查,迭代myList
并获得sublist
的大小。如果myList
== sublist
的大小,则分配true
,否则分配false
,如下所示:
public static boolean isSameLength(List<List<Integer>> myList) {
boolean isSame = false;
for (List<Integer> sublist : myList) {
if (sublist.size() == myList.size()) {
isSame = true;
} else {
isSame = false;
}
}
return isSame;
}
答案 4 :(得分:0)
我提出以下建议:
myList.stream()
.map(e -> e.size())
.distinct()
.limit(2) // optimization
.count() == 1;
基本上检查是否有任何 2 个不同大小的列表。