문제

저는 Python에 익숙하기 때문에 이것이 약간 혼란스럽습니다.사용자가 특정 숫자를 입력할 때까지 한 줄씩 입력을 받으려고 합니다.숫자는 일부 통계 수학을 적용하기 위해 배열에 저장됩니다.현재 저는 메인 클래스, 통계 클래스, "읽기" 클래스를 가지고 있습니다.

두 가지 질문:

  1. 입력 루프를 작동시킬 수 없는 것 같습니다. 그렇게 하는 가장 좋은 방법은 무엇입니까?

  2. 읽기 방법의 객체 유형은 무엇입니까?double[] 또는 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;
}

어떤 도움이라도 주시면 감사하겠습니다. 초보자를 용서해 주세요...

도움이 되었습니까?

해결책

답변:

>1.입력 루프를 작동시킬 수 없는 것 같습니다. 그렇게 하는 가장 좋은 방법은 무엇입니까?

do{}while 대신 간단한 while 루프를 사용하고 싶습니다...그리고 그 동안에 조건을 두십시오 ...내 예에서는 다음과 같습니다.

읽기 횟수가 종료 신호가 아니고 카운트가 제한보다 낮은 경우:하다.

>2.읽기 방법의 객체 유형은 무엇입니까?double[] 또는 ArrayList?

ArrayList이지만 대신 List(java.util.List) 인터페이스를 사용하는 것이 좋습니다.구현보다는 인터페이스에 프로그래밍하는 것이 좋은 OO 관행입니다.

>2.1method-type을 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"는 서명을 변경하지 않고도 하위 클래스에서 처리할 수 있습니다. 따라서 샘플에서는 "정적" 키워드를 제거하고 "InputTest" 클래스의 인스턴스를 생성했습니다.

Java 코드 스타일에서 변수 이름은 "end_signal"이 아닌 "endSignal"과 같은 Cammel 케이스로 입력되어야 합니다.

다른 팁

루프 조건에 필요한 것은 다음과 같습니다.

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

당신이하고있는 일은 카운터 변수를 감소시키는 것입니다.

또한 다음을 선언해야 합니다. ArrayList 이렇게:

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

이는 목록을 유형별로 만들고 주어진 조건을 허용합니다.그렇지 않으면 추가 캐스팅이 있습니다.

내 생각엔 당신이 나쁘지 않게 시작했다고 생각하는데, 여기에 내 제안이 있습니다.코드 아래에서 중요한 차이점과 요점을 강조하겠습니다.

패키지 콘솔;

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에서는 제네릭을 사용하는 것이 좋습니다.이렇게 하면 컴파일러와 가상 머신에 사용하려는 유형에 대한 힌트를 제공할 수 있습니다.이 경우 이중으로 이중 및 이중 값을 포함하도록 결과 목록을 선언함으로써 캐스팅/유형 변환없이 값을 사용할 수 있습니다.

    if (!readRange.isEmpty()) {
        double last = readRange.get(readRange.size() - 1);
    }
    
  2. 특정 목록(LinkedList,SynchronizedLists,...)의 구현이 많기 때문에 Java 컬렉션으로 작업할 때 인터페이스를 반환하는 것이 더 좋습니다.따라서 나중에 다른 유형의 목록이 필요한 경우 메서드 내부의 구체적인 구현을 쉽게 변경할 수 있으며 추가 코드를 변경할 필요가 없습니다.

  3. while 제어문이 왜 작동하는지 궁금할 수도 있지만, 보시다시피 주위에 괄호가 있습니다. 다음 = input.next().trim().이렇게 하면 조건부 테스트 직전에 변수 할당이 수행됩니다.또한 공백 문제를 피하기 위해 트림이 필요합니다.

  4. 나는 사용하지 않습니다 다음더블() 왜냐하면 사용자가 double이 아닌 것을 입력할 때마다 예외가 발생하기 때문입니다.String을 사용하면 사용자가 제공하는 모든 입력을 구문 분석할 수 있을 뿐만 아니라 종료 신호에 대해 테스트할 수도 있습니다.

  5. 확실히 사용자가 실제로 double을 입력했기 때문에 JavaDoc의 정규 표현식을 사용했습니다. Double.valueOf() 방법.이 표현식이 일치하면 값이 변환되고, 그렇지 않으면 오류 메시지가 인쇄됩니다.

  6. 코드에 표시되지 않는 이유로 카운터를 사용했습니다.얼마나 많은 값이 성공적으로 입력되었는지 알고 싶다면 다음을 호출하세요. readRange.size().

  7. 배열로 작업하려는 경우 생성자의 두 번째 부분에서 배열을 변환하는 방법을 보여줍니다.

  8. 내가 double과 Double을 섞어서 혼동하지 않기를 바랍니다. 그러나 Java 1.5의 Auto-Boxing 기능 덕분에 이것은 문제가 되지 않습니다.그리고 스캐너.다음() 결코 null(afaik)을 반환하지 않으므로 이는 전혀 문제가 되지 않습니다.

  9. 배열의 크기를 제한하려면 다음을 사용하십시오.

좋아요, 내 솔루션과 설명이 유용하길 바랍니다. 결과.크기() 지표와 키워드로 부서지다 while 제어문을 종료합니다.

안녕하세요, GHad

**

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;
}

**

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top