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 루프를 잠시 변경합니다.함수의 마지막 문장으로서 리턴을 하나만 갖는 것이 항상 더 우아합니다.
코드를 다시 작성해야 한다는 의미일 수 있습니다.예를 들어 다음과 같습니다.
- 정수 0 .. 범위-1의 배열을 만듭니다.모든 값을 0으로 설정합니다.
- 루프를 실행합니다.루프에서 난수를 생성합니다.목록에서 해당 인덱스를 참조하여 값이 1인지 확인합니다. 값이 1이면 루프에서 분리합니다.그렇지 않으면 해당 인덱스의 값을 1로 설정합니다.
- 목록의 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
'programing' 카테고리의 다른 글
정의된 모든 변수 보기 (0) | 2022.10.27 |
---|---|
mappedBy 알 수 없는 대상 엔티티 속성 (0) | 2022.10.26 |
JPA 2에서 CriteriaQuery를 사용하여 결과를 카운트하는 방법 (0) | 2022.10.26 |
python의 바이트 배열에 대한 16진수 문자열 (0) | 2022.10.26 |
랜덤 (Java 7)의 181783497276652981 및 8682522807148012는 무엇입니까? (0) | 2022.10.26 |