Как рассчитать длину массива без использования библиотеки

Вчера я появился на собеседовании, интервьюер сказал мне написать код для вычисления длины массива без использования свойства длины класса Array.

Например-

char[] array=new Scanner(System.in).nextLine().toCharArray();
// i have to write a code for calculating length of this array
//I can use any operator but use of library is restricted

Все ответы, данные здесь, используют библиотеку String.


person Community    schedule 09.06.2015    source источник
comment
в таком языке, как c, мы используем, пока цикл сопоставляет его с символом новой строки \n для разрыва, но как это делается с объектом.   -  person    schedule 09.06.2015
comment
использовать try catch, пока не получите исключение ArrayIndexOutOfBounds?   -  person almightyGOSU    schedule 09.06.2015
comment
@Госу. Да, я тоже пробовал это, но это не лучший стиль кодирования для определения результата по исключению.   -  person    schedule 09.06.2015
comment
Я надеюсь, что есть лучший способ сделать это (try/catch действительно кажется глупым).   -  person almightyGOSU    schedule 09.06.2015
comment
@gosu, как класс Array оценивает свое свойство длины? так как этот файл .class недоступен с src?   -  person    schedule 09.06.2015
comment
Вы можете обратиться к этому: stackoverflow.com/ вопросы/9297899/   -  person almightyGOSU    schedule 09.06.2015


Ответы (4)


Более хорошим решением может быть использование метода: java.lang.reflect.Array::getLength

Например:

import java.lang.reflect.Array;

public class ArrayLength {
    public static void main(String[] args) {
        char[] array = new char[]{'a', 'b', 'a', 'c'};
        System.err.println(Array.getLength(array));
    }

}
person gontard    schedule 09.06.2015
comment
не могли бы вы показать мне код, как использовать API отражения, так как я не знаю об отражении. - person ; 09.06.2015
comment
@dubey-theHarcourtians Я добавил небольшой пример - person gontard; 09.06.2015
comment
это полезно знать reflection API, но с точки зрения ответов это бессмысленно, поскольку API ограничены. - person ; 09.06.2015
comment
API ограничены? - person gontard; 09.06.2015

попробуй это:

    char []c = {'a', 'b', 'c'};
    int i = 0;
    int l = 0;
    try{
    while(c[i++] != 0)
    {
        System.out.println(c[i-1]);
        l++;
    }
    }catch(Exception a)
    {};
    System.out.println(l);
person Diabolus    schedule 09.06.2015

Согласно моему предложению в комментариях, что определенно не является хорошей практикой.

import java.util.Scanner;

public class QuickTester {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("Enter something: ");
        char [] charArr = sc.nextLine().toCharArray();

        int i = 0;
        try {
            while(true) {
                char c = charArr[i++];
            }
        }
        catch (ArrayIndexOutOfBoundsException e) {

        }

        System.out.println("Length: " + (i-1));
    }
}

Вывод:

Enter something: Banana
Length: 6
person almightyGOSU    schedule 09.06.2015
comment
Плохая практика — не использовать свойство length. Этот вопрос интервьюера глупый. - person gontard; 09.06.2015
comment
@gontard Иногда им просто нравится придумывать каверзные вопросы? Я имею в виду, что в конце концов невозможно найти длину без свойства длины. - person almightyGOSU; 09.06.2015
comment
@gontard Интервьюер никогда не бывает глупым, я думаю, он пытался узнать, на каком уровне вы можете думать, идея заключалась не в том, чтобы получить код для перспективы кодирования. Это был тест на нестандартное мышление. - person ; 09.06.2015
comment
Я не сказал, что интервьюер тупой, только его вопрос... Я думаю, что такие вопросы не помогут нанять хорошего разработчика. - person gontard; 09.06.2015

person    schedule
comment
по-детски....отлично for each loop это самое простое решение этого.очень забавно.почему это не строго к нам до сих пор, молодец. - person ; 09.06.2015
comment
В этом случае: Свойство length используется на уровне байт-кода: arraylength - person gontard; 09.06.2015
comment
@gontard спасибо за предоставление такой информации, но этого следовало ожидать, поскольку это делается jdk, а не нами. - person ; 09.06.2015
comment
@ dubey-theHarcourtians да, наверное. - person gontard; 09.06.2015