programing

Java 메서드에서 불필요한 반환을 방지하려면 어떻게 해야 합니까?

newsource 2022. 10. 26. 21:07

Java 메서드에서 불필요한 반환을 방지하려면 어떻게 해야 합니까?

가 지금 이 좀 안 좋아요.return의 ""에 "for이치노

컴파일러가 합니다.return「」의 for루프입니다. 이 방법을 최적화하는 우아한 방법을 알고 싶습니다. 현재 제가 이해하고 있는 범위를 넘어섰습니다. 그리고 제가 시도한 브레이크 구현 중 어느 것도 효과가 없는 것 같습니다.

할당에서 임의의 정수를 생성하고 int 파라미터로 메서드에 전달된 범위 내에서 생성된 두 번째 랜덤 정수가 발견될 때까지 반복을 반환하는 메서드를 첨부합니다.

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
    }
    return 0; // Never reached
}

할 수 .return 연락이 안 될 것throw상황을 명확히 하기 위해서요

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) {
        ...
    }

    throw new AssertionError("unreachable code reached");
}

@BoristheSpider가 지적한 바와 같이 두 번째는return스테이트먼트는 의미상 도달할 수 없습니다.

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    int count = 0;

    while (true) {
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
        count++;
    }
}

컴파일 및 동작은 양호합니다.라도 '아예'를 ArrayIndexOutOfBoundsException명시적으로 아무것도 던지지 않아도 구현이 의미적으로 잘못되었다는 것을 알 수 있습니다.

for이 경우 라벨을 사용할 수 있습니다(다음 예 참조).

private static int oneRun(int range) {
    int returnValue=-1;

    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    OUTER: for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.   
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                returnValue = count;
                break OUTER;
            }
        }
    }
    return returnValue;
}

아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.일반적으로 이러한 문제는 코드가 너무 복잡하다는 것을 의미합니다.코드를 보면 배열에 이전 번호가 저장되는 것을 원하지 않는 것이 분명합니다.은 「」를 원한다.Set:

Set<Integer> previous = new HashSet<Integer>();

int randomInt = generator.nextInt(range);
previous.add(randomInt);

for (int count = 1; count <= range; count++) {
    randomInt = generator.nextInt(range);
    if (previous.contains(randomInt)) {
       break;
    }

    previous.add(randomInt);
}

return previous.size();

반환되는 것은 실제로 세트의 크기입니다.코드 복잡도가 2차에서 선형으로 감소하여 바로 읽기 쉬워졌습니다.

게 걸 알 수 요.count 링크:

Set<Integer> previous = new HashSet<Integer>();

int randomInt = generator.nextInt(range);

while (!previous.contains(randomInt)) {          
    previous.add(randomInt);      
    randomInt = generator.nextInt(range);
}

return previous.size();

루프의 으로 하기 루프의 을 단순히 루프의 조건으로 할 수 .count < range그런 다음 함수의 마지막에 이 마지막 값(마지막 생략)을 반환합니다.

private static int oneRun(int range) {
    ...

    for (int count = 1; count < range; count++) {
        ...
    }
    return range;
}

이렇게 하면 도달할 수 없는 코드를 입력할 필요가 없습니다.

temp 변수(예: "result")를 사용하여 내부 복귀를 삭제합니다.적절한 조건으로 for 루프를 잠시 변경합니다.함수의 마지막 문장으로서 리턴을 하나만 갖는 것이 항상 더 우아합니다.

코드를 다시 작성해야 한다는 의미일 수 있습니다.예를 들어 다음과 같습니다.

  1. 정수 0 .. 범위-1의 배열을 만듭니다.모든 값을 0으로 설정합니다.
  2. 루프를 실행합니다.루프에서 난수를 생성합니다.목록에서 해당 인덱스를 참조하여 값이 1인지 확인합니다. 값이 1이면 루프에서 분리합니다.그렇지 않으면 해당 인덱스의 값을 1로 설정합니다.
  3. 목록의 1 수를 세고 해당 값을 반환합니다.

return 문이 있고 내부에 루프/루프가 있는 메서드는 항상 루프 외부에 리턴 문이 필요합니다.루프 외부에 있는 이 스테이트먼트가 도달하지 않는 경우라도.이 경우 불필요한 반환문을 피하기 위해 메서드의 시작 부분(즉, 각 루프 전/외부)에서 각 유형의 변수(사용자의 경우 정수)를 정의할 수 있습니다.루프 내에서 원하는 결과에 도달하면 해당 값을 이 사전 정의된 변수에 귀속시켜 루프 외부의 리턴 스테이트먼트에 사용할 수 있습니다.

rInt[i]가 rInt[count]일 때 메서드가 첫 번째 결과를 반환하도록 하기 때문에 위의 변수만 구현하는 것만으로는 충분하지 않습니다.이는 rInt[i]가 rInt[count]일 때 메서드가 마지막 결과를 반환하기 때문입니다.하나의 옵션은 원하는 결과를 얻었을 때 호출되는2개의 "break 스테이트먼트"를 실장하는 것입니다.방법은 다음과 같습니다.

private static int oneRun(int range) {

        int finalResult = 0; // the above-mentioned variable
        int[] rInt = new int[range + 1];
        rInt[0] = generator.nextInt(range);

        for (int count = 1; count <= range; count++) {
            rInt[count] = generator.nextInt(range);
            for (int i = 0; i < count; i++) {
                if (rInt[i] == rInt[count]) {
                    finalResult = count;
                    break; // this breaks the inside loop
                }
            }
            if (finalResult == count) {
                break; // this breaks the outside loop
            }
        }
        return finalResult;
    }

도달할 수 없는 문장이 발생할 경우 예외를 두어야 한다는 데 동의합니다.같은 방법으로 보다 읽기 쉬운 방법으로 이 작업을 수행할 수 있는지 보여드리고자 합니다(Java 8 스트림 필요).

private static int oneRun(int range) {
    int[] rInt = new int[range + 1];
    return IntStream
        .rangeClosed(0, range)
        .peek(i -> rInt[i] = generator.nextInt(range))
        .filter(i -> IntStream.range(0, i).anyMatch(j -> rInt[i] == rInt[j]))
        .findFirst()
        .orElseThrow(() -> new RuntimeException("Shouldn't be reached!"));
}
private static int oneRun(int range) {
    int result = -1; // use this to store your result
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range && result == -1; count++) { // Run until result found.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.   
        for (int i = 0; i < count && result == -1; i++) { // Check for past occurence and leave after result found.
            if (rInt[i] == rInt[count]) {
                result = count;
            }
        }
    }
    return result; // return your result
}

언급URL : https://stackoverflow.com/questions/42184317/how-do-i-avoid-a-useless-return-in-a-java-method