Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查列表中的列表是否具有相同的长度_Java_List - Fatal编程技术网

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

Java 如何检查列表中的列表是否具有相同的长度,java,list,Java,List,我有一个Java列表。代码如下: 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

我有一个Java列表。代码如下:

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);
List myList=new ArrayList();
添加(新的ArrayList());
添加(新的ArrayList());
添加(新的ArrayList());
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);

如何检查myList中存在的列表是否具有相同的长度?我知道我可以通过类似于myList.get(0).size()的方法检查每个列表的长度,那么什么是检查所有这些列表是否具有相同长度(而不是逐个检查)的有效且简短的方法呢?

您可以通过匹配任何包含的列表大小(例如第一个)来使用
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())

您还可以使用计数器变量进行检查,迭代
myList
并获取
子列表的大小。如果
myList
==
子列表的大小
则分配
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;
}
myList.stream()
    .map(e -> e.size())
    .distinct()
    .limit(2)  // optimization
    .count() == 1;
public静态布尔值isSameLength(列表myList){
布尔值IsName=false;
对于(列表子列表:myList){
if(sublist.size()==myList.size()){
IsName=true;
}否则{
IsName=假;
}
}
返回ISNAME;
}

如果不访问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;
}
公共静态布尔SameleLength(列表){
if(lists.get(0)==null){//EDIT:davidxxx指出,这种if是多余的
返回true;
}
int len=lists.get(0.size();
用于(列表:列表){
if(list.size()!=len){
返回false;
}
}
返回true;
}

我的IDE甚至建议对上述代码使用函数运算符,如davidxxx所说。

如果使用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");
}

我提议如下:

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;
}
myList.stream()
    .map(e -> e.size())
    .distinct()
    .limit(2)  // optimization
    .count() == 1;

基本上检查是否有任何两个大小不同的列表。

if(sublist.size()==myList.size()){
是无效的。您要检测的是“大小是否不同”。此外,您可以在检测到此情况后立即退出循环。您不需要有布尔标志。@davidxxx布尔标志是必需的,因为我们需要在每次迭代时重写结果。@SudhirOjha
sublist.size()==myList.size()
意味着您将父列表的大小与每个子列表的大小进行比较。这不是他想要的。他想要检查所有子列表的大小是否相同?那么,在不使用流的情况下,您将如何做到这一点?@Sudhir Ojha Raven的答案说明了在没有流的情况下执行此操作的方法:不需要任何标志。回答得很好。但我认为第一次检查
如果(lists.get(0)=null){return true;}
不是必需的,因为要保持一致,您应该对每个包含的列表都执行此操作,而且检查null实际上不是必需的。谢谢-流更具可读性,在这种情况下进行优化没有多大意义,但它们运行的时间稍长一些(对于很长的
列表
)。空检查-如果
列表
为空,这仍然会崩溃,但我认为我可能希望为空列表返回
true
-因为在0个列表中,它们都具有相同的长度。可能
if(lists.isEmpty())
更有意义。欢迎:)列表在某些索引处可能有空元素,在下一个索引处可能没有空值。因此
list.get(0)==null
似乎太具体了。
if(list.isEmpty())
更有意义,但如果没有任何包含的列表,则意味着没有迭代。因此没有优化。:)当然-你是对的。在这种形式下,两种检查都没有任何意义(我没有考虑在<代码> 0代码/代码>和< <代码> >整数< /代码> <代码> 1 < /代码>下存在“<代码>空/代码>的情况。我不知道您是否应该编写空校验(例如,在前段内)。或者说,如果
列表
包含
null
,则会引发异常?根据OP示例,null情况是不可能的,因此正如我在第一条评论中所说的,我只会忽略这一点。一般来说,如果情况已知并且可以处理,则执行null检查比留下异常要好打开是一个异常的事情,它表明了一个问题。