如何检查列表中的列表是否具有相同的长度

时间:2018-10-12 09:50:38

标签: java list

我有一个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); 之类的方法检查每个列表的长度,那么一种有效且简短的方法来检查所有这些列表的长度是否相同(而不是一个个地检查)?

5 个答案:

答案 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 个不同大小的列表。