일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 엔티티 코드 치환
- Docker Compose
- Tomcat
- aws elasticache 활용
- Stack
- select
- 정규식
- 만들면서 배우는 클린 아키텍처
- redis + spring boot 함께
- springboot+redis
- mysql
- 제이쿼리
- 초단위
- catalina.out
- for문
- 특수문자 치환
- insert
- jQuery
- 자바스크립트
- js
- Java
- 자바
- docker 컨테이너로 띄우기
- architecture
- 톰캣
- sftp
- javascript
- Entity Code 치환
- Linux
- 리눅스
- Today
- Total
꾸준하게, 차근차근
[Java] 배열에 특정 값 존재(포함)여부 체크 본문
1. for문
- 반복문을 통해 배열의 요소를 순회, 요소와 key값을 하나씩 비교하며 key값과 일치하는 값이 존재하는지 확인한다.
public void solutionFor() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( int lotto : lottos )
{
for( int win_num : win_nums )
{
if( lotto == win_num )
{
prize_count++;
break;
}
}
}
System.out.println(Math.min(7-prize_count, 6));
}
2. binarySearch()
- 이진탐색 메서드를 사용해 정렬된 배열에서 key값을 검색한다.
key값 검색에 성공하면 해당 값이 존재하는 위치(index >= 0)를 반환하고, key값 검색에 실패하면 삽입 포인트(index < 0)를 반환한다.
*삽입위치(inertion point): 배열에 key값이 삽입된다면 어느 위치(index)에 들어와야 할지 알려준다. 탐색 실패시 음수값을 반환하는데 이 음수값을 -(index)-1하면 양수 삽입 위치를 알 수 있다.
binarySearch() 메서드는 반드시 정렬된 배열에 사용해야 한다.
이진탐색 배열요소-key값과의 대소비교를 통해 탐색 범위를 줄여나가기 때문에 정렬되지 않은 배열에 사용하면 기대한 결과와 다르게 이상한 값이 반환된다.
public void solutionBinarySearch() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
Arrays.sort(lottos);
Arrays.sort(win_nums);
for( int lotto : lottos )
{
if( Arrays.binarySearch(win_nums, lotto) >= 0 )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
3. anyMath()
- Arrays.stream(int[] array) 메서드를 사용하여 int 배열을 IntStream으로 변경한 후,
.anyMatch() 메서드를 사용해 요소 중에서 key값과 일치하는 값이 존재하는지 여부(true/false)를 확인한다.
public void solutionAnyMath() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( int lotto : lottos )
{
if( Arrays.stream(win_nums).anyMatch(i -> i == lotto) )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
4. contains()
- Arrays.asList() 메서드를 사용하여 배열을 List로 변경한 후,
contains() 메서드를 사용하여 리스트 내 요소 중에 key값이 존재 여부를 확인한다.
public static int solutionContains() {
Integer[] lottos = {44, 1, 0, 0, 31, 25};
Integer[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( Integer lotto : lottos )
{
if( Arrays.asList(win_nums).contains(lotto) )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
리스트화할 배열이 int[] 타입이고 key값이 int 타입일 경우 제대로 작동 안할 수 있다.
Arrays.asList()로 배열을 리스트화 할 때 List<T> asList(T...) 메서드의 제네릭스에 int[] 타입이 그대로 전달되어 List<int[]>와 같이 int[] 타입으로 리스트화 되어 버리기 때문이다.
(우리가 원한건 List<int>) 그래서 int[] 배열을 asList<T...>로 리스트화 한 다음 contains(int key)를 수행하게 되어버리면 '{1, 2, 3, 4} == 3'과 같이 배열 자체와 int값이 비교되어버려 무조건 false를 반환한다.
전달 인자 | asList() 기대 반환값 | asList() 실제 반환값 |
int[] array | List<int> | List<int[]> |
Integer[] array | List<Integer> | List<Integer> |
🙏 참조 ::
'Java' 카테고리의 다른 글
[Java] 파일 Zip파일로 압축하여 업로드(암호설정) 구현(zip4j 사용) (0) | 2022.04.26 |
---|---|
[Java] 배열 내 요소 중복여부 체크 (0) | 2022.04.26 |
[Java] 정규식(Regular Expression) (0) | 2022.03.19 |
[Java] 문자열 시분초 -> 초단위로 변환(timeToSec) 구현 (0) | 2021.10.15 |
[Java] 초단위 -> 문자열 시분초로 변환(secToTime) 구현 (0) | 2021.10.15 |