ArrayList в Java и ввод

java arrays arraylist

16773 просмотра

5 ответа

Я привык к питону, так что меня это немного смущает. Я пытаюсь вводить данные построчно, пока пользователь не введет определенное число. Числа будут сохранены в массиве, чтобы применить к ним некоторые статистические математические данные. В настоящее время у меня есть основной класс, классы статистики и класс «чтения».

Два вопроса:

  1. Я не могу заставить цикл ввода работать, что является лучшим способом для этого.

  2. Каким будет тип объекта для метода чтения? Двойной [] или ArrayList?

    1. Как мне объявить метод-тип как arraylist?

    2. Как предотвратить сохранение в массиве более 1000 значений?

Позвольте мне показать, что я имею до сих пор:

public static java.util.ArrayList readRange(double end_signal){
    //read in the range and stop at end_signal

    ArrayList input = new ArrayList();
    Scanner kbd = new Scanner( System.in );
    int count = 0;
    do{
        input.add(kbd.nextDouble());
        System.out.println(input); //debugging
        ++count;
    } while(input(--count) != end_signal);
    return input;
}

Любая помощь будет принята с благодарностью, простите за мою новизну ...

Автор: Octaflop Источник Размещён: 11.06.2019 01:35

Ответы (5)


2 плюса

Решение

ответы:

> 1. Я не могу заставить цикл ввода работать, что является лучшим способом для этого.

Я предпочел бы иметь простой цикл while вместо do {} while ... и поместить условие в while ... В моем примере это читается так:

в то время как число чтения не является сигналом окончания и счетчик ниже предела: do.

> 2. Каким будет тип объекта для метода чтения? Двойной [] или ArrayList?

ArrayList, однако я настоятельно рекомендую вам использовать интерфейс List (java.util.List). Хорошей практикой ОО является программирование на интерфейс, а не на реализацию.

> 2.1Как я могу объявить метод-тип как arraylist?

Смотрите код ниже.

> 2,2. Как предотвратить сохранение в массиве более 1000 значений?

Добавив это ограничение в условие while.

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class InputTest{

    private int INPUT_LIMIT = 10000;

    public static void main( String [] args ) {
        InputTest test = new InputTest();
        System.out.println("Start typing numbers...");
        List list = test.readRange( 2.0 );
        System.out.println("The input was " +  list );
    }

    /**
     * Read from the standar input until endSignal number is typed.
     * Also limits the amount of entered numbers to 10000;
     * @return a list with the numbers.
     */
    public List readRange( double endSignal ) {
        List<Double> input = new ArrayList<Double>();
        Scanner kdb = new Scanner( System.in );
        int count = 0;
        double number = 0;
        while( ( number = kdb.nextDouble() ) != endSignal && count < INPUT_LIMIT ){
            System.out.println( number );
            input.add( number );
        }
        return input;
    }
}

Заключительные замечания:

Предпочтительнее иметь «методы экземпляра», чем методы класса. Таким образом, при необходимости «readRange» может быть обработан подклассом без необходимости изменять сигнатуру, таким образом, в примере я удалил ключевое слово «static» и создал экземпляр класса «InputTest»

В стиле кода Java имена переменных должны идти в случае Cammel, как в «endSignal», а не «end_signal»

Автор: OscarRyz Размещён: 22.09.2008 06:15

5 плюса

Что вам нужно в вашем состоянии цикла:

while ( input.get( input.size()-1 ) != end_signal );

То, что вы делаете, это уменьшение переменной счетчика.

Также вы должны объявить ArrayListподобное так:

ArrayList<Double> list = new ArrayList<Double>();

Это делает список специфичным для типа и допускает условие как дано. В противном случае есть дополнительный кастинг.

Автор: Jason Cohen Размещён: 22.09.2008 05:34

0 плюса

Я думаю, что вы начали неплохо, но вот мое предложение. Я выделю важные различия и пункты ниже кода:

пакетная консоль;

импорт java.util. ; импорт java.util.regex. ;

открытый класс ArrayListInput {

public ArrayListInput() {
    // as list
    List<Double> readRange = readRange(1.5);

    System.out.println(readRange);
    // converted to an array
    Double[] asArray = readRange.toArray(new Double[] {});
    System.out.println(Arrays.toString(asArray));
}

public static List<Double> readRange(double endWith) {
    String endSignal = String.valueOf(endWith);
    List<Double> result = new ArrayList<Double>();
    Scanner input = new Scanner(System.in);
    String next;
    while (!(next = input.next().trim()).equals(endSignal)) {
        if (isDouble(next)) {
            Double doubleValue = Double.valueOf(next);
            result.add(doubleValue);
            System.out.println("> Input valid: " + doubleValue);
        } else {
            System.err.println("> Input invalid! Try again");
        }
    }
    // result.add(endWith); // uncomment, if last input should be in the result
    return result;
}

public static boolean isDouble(String in) {
    return Pattern.matches(fpRegex, in);
}

public static void main(String[] args) {
    new ArrayListInput();
}

private static final String Digits = "(\\p{Digit}+)";
private static final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
private static final String Exp = "[eE][+-]?" + Digits;
private static final String fpRegex = ("[\\x00-\\x20]*" + // Optional leading "whitespace"
        "[+-]?(" + // Optional sign character
        "NaN|" + // "NaN" string
        "Infinity|" + // "Infinity" string

        // A decimal floating-point string representing a finite positive
        // number without a leading sign has at most five basic pieces:
        // Digits . Digits ExponentPart FloatTypeSuffix
        // 
        // Since this method allows integer-only strings as input
        // in addition to strings of floating-point literals, the
        // two sub-patterns below are simplifications of the grammar
        // productions from the Java Language Specification, 2nd
        // edition, section 3.10.2.

        // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
        "(((" + Digits + "(\\.)?(" + Digits + "?)(" + Exp + ")?)|" +

        // . Digits ExponentPart_opt FloatTypeSuffix_opt
        "(\\.(" + Digits + ")(" + Exp + ")?)|" +

        // Hexadecimal strings
        "((" +
        // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "(\\.)?)|" +

        // 0[xX] HexDigits_opt . HexDigits BinaryExponent
        // FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +

        ")[pP][+-]?" + Digits + "))" + "[fFdD]?))" + "[\\x00-\\x20]*");// Optional
                                                                        // trailing
                                                                        // "whitespace"

}

  1. В Java хорошо использовать дженерики. Таким образом вы дадите компилятору и виртуальной машине подсказку о типах, которые вы собираетесь использовать. В этом случае его double и объявив результирующий список, содержащий двойные значения, вы можете использовать значения без приведения / преобразования типов:

    if (!readRange.isEmpty()) {
        double last = readRange.get(readRange.size() - 1);
    }
    
  2. Интерфейсы лучше возвращать при работе с коллекциями Java, так как существует много реализаций определенных списков (LinkedList, SynchronizedLists, ...). Поэтому, если позже вам понадобится другой тип List, вы можете легко изменить конкретную реализацию внутри метода, и вам не нужно менять какой-либо дополнительный код.

  3. Вы можете задаться вопросом, почему оператор управления while работает, но, как видите, вокруг next = input.next (). Trim () есть скобки . Таким образом, присвоение переменной происходит непосредственно перед условным тестированием. Кроме того, аккуратность берет playe, чтобы избежать проблем с пробелами

  4. Я не использую здесь nextDouble (), потому что всякий раз, когда пользователь вводит что-то, что не является двойным, вы получите исключение. Используя String, я могу анализировать любые входные данные, которые дает пользователь, а также проверять конечный сигнал.

  5. Чтобы быть уверенным, что пользователь действительно ввел double, я использовал регулярное выражение из JavaDoc метода Double.valueOf () . Если это выражение совпадает, значение преобразуется, если не будет напечатано сообщение об ошибке.

  6. Вы использовали счетчик по причинам, которых я не вижу в вашем коде. Если вы хотите узнать, сколько значений было успешно введено, просто вызовите readRange.size () .

  7. Если вы хотите работать с массивом, вторая часть конструктора покажет, как его преобразовать.

  8. Надеюсь, вы меня не смущаете, смешивая Double и Double, но благодаря функции Auto-Boxing в Java 1.5 это не проблема. И поскольку Scanner.next () никогда не вернет значение null (afaik), это вообще не должно быть проблемой.

  9. Если вы хотите ограничить размер массива, используйте

Хорошо, я надеюсь, что вы нашли мое решение и объяснения полезными, используйте result.size () в качестве индикатора и ключевое слово break, чтобы выйти из оператора while.

Привет, GHad

Автор: GHad Размещён: 22.09.2008 06:16

0 плюса

**

public static java.util.ArrayList readRange(double end_signal) {

    //read in the range and stop at end_signal

    ArrayList input = new ArrayList();

    Scanner kbd = new Scanner(System. in );
    int count = 0;

    do {
        input.add(Double.valueOf(kbd.next()));
        System.out.println(input); //debugging
        ++count;
    } while (input(--count) != end_signal);
    return input;
}

**

Автор: l_39217_l Размещён: 22.09.2008 05:36

0 плюса

public static ArrayList&lt;Double> readRange(double end_signal) {

    ArrayList<Double> input = new ArrayList<Double>();
    Scanner kbd = new Scanner( System.in );
    int count = 0;
    do{
        input.add(kbd.nextDouble());
        ++count;
    } while(input(--count) != end_signal);
return input;
}
Автор: user9103082 Размещён: 11.06.2019 03:33
Вопросы из категории :
32x32