Проверка, все ли строки имеют одинаковую длину в массиве String в Java - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь решить вопрос, в котором мне дан строковый массив слов, и я должен проверить, все ли они имеют одинаковую длину или нет. Например, если мне дан массив {"apple","purple","lemon"}, тогда мой метод должен вернуть true, а когда мне дан массив {"red","blue"}, он должен вернуть false.

Это то, что я делал до сих пор Но это не работает. Я ценю любую помощь.

public static boolean allEqualLength(String[] myArray){
    int i;
    for(i=0;i<myArray.length;i++){
        if(myArray[i]!=myArray[i+1])
            return false;
        }    
    return true,
}

Ответы [ 6 ]

1 голос
/ 26 мая 2020

Например, у вас есть массив длиной 4, у вас есть позиции 0,1,2,3, поэтому в вашем коде вы запускаете с: myArray[i]!=myArray[i+1], поэтому при последнем запуске вы проверяете позиции: 3 и 4, и вы получите ArrayIndexOutOfBoundsException , вам нужно изменить на: length-1 в условии l oop, например:

public static boolean allEqualLength(String[] myArray){
    int i;
    for(i=0;i<myArray.length -1;i++){
        if(myArray[i].length() != myArray[i+1].length())
            return false;
        }    
    return true,
}

Если вы запустите myArray.length, позиции, которые проверяют:

0--1
1--2
2--3
3--4 // ERROR !!! ArrayIndexOutOfBoundsException !!

Если вы запустите myArray.length-1, позиции, которые проверяют:

0--1
1--2
2--3 -OK !!!

Таким образом, если вы запустите массив с: myArray.length-1, вы не получите ArrayIndexOutOfBoundsException.

1 голос
/ 26 мая 2020

Вы пытаетесь сравнить сами строки. Вы должны сравнивать только длину.

myArray[i].length() != myArray[i + 1].length()

Между прочим, это вызовет ArrayIndexOutOfBoundsException, потому что вы пытаетесь получить доступ к индексу myArray[myArray.length]. Измените для l oop на

for (int i = 0; i < myArray.length - 1; i++) {
    if (myArray[i].length() != myArray[i + 1].length()) {
        return false;
    }
}

Также убедитесь, что вы возвращаете true, если длина массива равна 0 или 1, потому что l oop не может их обработать.

1 голос
/ 26 мая 2020

Я делаю что-то вроде этого:

public static boolean allEqualLength(String[] myArray) {

     int strLength = myArray[0].length();

    for (String str :
            myArray) {
        if (str.length() != strLength)
            return false;
    }
     return true;
}

Таким образом вы можете избежать любых проблем с индексацией в вашем l oop.

1 голос
/ 26 мая 2020

Все элементы одинаковой длины равносильны утверждению, что все элементы должны иметь ту же длину, что и первый элемент:

public static boolean allEqualLength(String[] myArray) {
    // zero items => "all" items have same length:
    if (myArray.length == 0) return true;
    final int expectedLength = myArray[0].length();
    for(int i = 0; i < myArray.length; ++i) {
        if(myArray[i].length() != expectedLength)
            return false;
    }    
    return true,
}

Но ваше исходное решение было не так уж и далеко. Вам просто нужно убедиться, что вы не выходите за границы массива и сравнивать длины строк, а не сами строки:

public static boolean allEqualLength(String[] myArray) {
         for(int i=0; i < myArray.length - 1; i++) { // -1 to not exceed bounds
             if(myArray[i].length() != myArray[i+1].length()) // compare length, not memory addresses
                return false;
         }    
         return true,
}
0 голосов
/ 28 мая 2020

Если производительность не является проблемой, и вы не будете использовать ее в 1 млн строк или что-то в этом роде, в дополнение ко всем этим ответам, вот один лайнер:

boolean allStringsEqualLength = Stream.of(array)
        .map(String::length).distinct().count() == 1;

Идея состоит в том, чтобы сопоставить каждую строка до ее длины. Итак, если distinct() поток содержит только одно значение, это означает, что все строки имеют одинаковую длину.

0 голосов
/ 26 мая 2020

Во-первых, вы не проверяете длину элементов, другая проблема - это ваш for l oop попытается получить доступ к индексу массива за пределами границ, поскольку у вас есть i + 1, последний элемент уже проверяется таким образом, учитывая, что вы просто нужно до myArray.length - 1.

Используя ваш код, это будет выглядеть примерно так:

public static boolean allEqualLength(String[] myArray) {
    for (int i = 0; i < myArray.length - 1; i++) {
        if (myArray[i].length() != myArray[i + 1].length())
            return false;
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...