как проверить, имеют ли списки в списке одинаковую длину - PullRequest
0 голосов
/ 12 октября 2018

У меня есть список списков на 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);

Как проверить, имеют ли списки, которые существуют в myList, одинаковую длину?Я знаю, что могу проверить длину каждого списка, например, myList.get(0).size(), что является эффективным и коротким способом проверки, имеют ли все эти списки одинаковую длину (вместо проверки один за другим)?

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Если вы используете Java 8, вы можете использовать лямбда-выражения, чтобы упростить ваше приложение.Смотри:

if (myList.stream().filter(integers -> integers.size() == myList.get(0).size()).count() == myList.size()) {
    System.out.println("The sub-lists have the same size");
}
0 голосов
/ 12 октября 2018

Вы также можете проверить с помощью переменной счетчика, выполнить итерацию вашего 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;
}
0 голосов
/ 12 октября 2018

Нельзя надеяться, что списки 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.

0 голосов
/ 12 октября 2018

Вы можете использовать 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...