728x90
예제코드
: 문자열로 구성된 배열에서 가장 긴 문자열/가장 짧은 문자열을 제거하고 반환
: 같은 길이가 뒤에 나오면 뒤의 문자열을 제거
import java.util.*;
public class remove {
public static void main(String[] args) {
String[] exam = {"총맞은것처럼", "뱅뱅뱅", "빰", "안녕이란말헬로헬로","뱀","가슴이 너무 아파"}; // 예시 문자열 배열
// Array의 경우, Arrays.toString(event)로 와야 정상적으로 프린트 된다. 그냥 event를 넣으면 주소값이 반환된다.
System.out.println(Arrays.toString(removeExtremes(exam)));
}
public static String[] removeExtremes(String[] arr) {
/*
1. 문자열을 순회하면서, 각 인덱스의 문자열을 순차적으로 비교
2. 두 값중 작은 문자열은 min에, 큰 문자열은 max에 저장
3. 값이 min과 max인 문자열을 제외한 array를 리턴
4. 스트림 사용하여 필터링
*/
if (arr.length==0) return null; //배열이 비어있으면 null 리턴
String max = arr[0]; //현재까지 제일 큰 문자열. 초기값은 arr의 처음 값
String min = arr[0]; //현재까지 제일 작은 문자열. 초기값은 arr의 처음 값
for(int i=0 ; i<arr.length ; i++) {
if(max.length() <= arr[i].length()) max=arr[i]; // 후순위로 오는 문자열의 길이가 크거나 같으면 뒤에 오는 것으로 대체
if(min.length() >= arr[i].length()) min=arr[i]; // 후순위로 오는 문자열의 길이가 작거나 같으면 뒤에 오는 것으로 대체
}
// 람다식을 사용할 외부변수는 모두 레퍼런스 타입이 아니거나 final로 선언되어야 함
final String finalMax = max;
final String finalMin = min;
// 문자열을 비교할 경우, ==이 아닌 .equals()를 사용해야함. 즉,a->a !=변수명 대신 a->!변수명.equals(a)
return Arrays.stream(arr).filter(a-> !finalMax.equals(a)).filter(a-> !finalMin.equals(a)).toArray(String[]::new);
}
}
문제점
문제점 1) error: local variables referenced from a lambda expression must be final or effectively final
문제점 2) 스트림 상에서 필터링
문제점 3) println을 통한 결과값 출력으로 주소값이 나옴
해결
해결 1) 참고링크 : 람다식과 final
람다식을 사용할 외부변수는 모두 레퍼런스 타입이 아니거나 final로 선언되어야 함
해결 2) 참고링크 : ==와 equals()
문자열을 비교할 경우, ==이 아닌 .equals()를 사용해야함. 즉,a->a !=변수명 대신 a->!변수명.equals(a)
해결 3) 참고링크 : StackOverflow
Array의 경우, Arrays.toString(event)로 와야 정상적으로 프린트 된다. 그냥 event를 넣으면 주소값이 반환된다.
728x90
'Java & Spring > Error' 카테고리의 다른 글
[에러해결] NoUniqueBeanDefinitionException (0) | 2022.08.16 |
---|---|
[에러해결] 값 비교 (.equals / == ) (0) | 2022.08.12 |
[에러해결] Spring - not a regular file 에러 (0) | 2022.08.09 |
[에러해결] Intellij에서 JAVA 프로젝트 인식시키기 (0) | 2022.07.11 |
[에러해결] Intellij - Java 한글 깨짐 오류 (0) | 2022.07.07 |