java
Random 객체의 중복 제거
뚜벅뚜벅뚜벅이
2022. 8. 2. 19:46
반응형
랜덤으로 숫자를 가지고와서 숫자들의 중복을 제거하는 것은 해본적이 있다.
상황
: 현재 리스트에 저장되어있는 객체들을 모두가지고 와서 객체의 pk를 기준으로 9개를 뽑아내되, 중복을 제거한다.
해결
: 인덱스값은 int 이지만 그 숫자가 대표하는것은 객체이므로 배열을 선언하여 배열에 담는다.
//장소리스트 (장소객체가 담겨있다.)
List<PlaceVO> placeList = placeservice.selectPlace();
//랜덤한 순서로 배치된 장소들을 담을 새로운 배열
List<PlaceVO> randomList = new ArrayList<PlaceVO>();
Random random = new Random();
if(placeList.size() > 0) {
//인덱스 값을 담을 배열 생성
int[] idx = new int[9];
for(int i=0; i<idx.length; i++) {
if(i!=0) {
boolean flag = true;
while(flag) {
//새로운 수 생성
int randomNum = random.nextInt(placeList.size());
//기존의 배열에 새로 넣으려고 하는 randomNum이 있는지 비교
boolean checkSame = false;
for(int j=0; j<i; j++) {
if(idx[j]==randomNum) {
//이미 같은 값이 존재한다면 for문 나가서 while문 부터 다시 돌기
checkSame = true;
break;
}
}
//기존의 배열에 존재하지 않는 값이면 위의 for문을 나와서 아래의 if문을 탄다.배열에 그 값을 넣고 다시 첫번째 for 문으로 가기
if(!checkSame) {
idx[i] = randomNum;
flag = false;
}
}
//첫번째 값은 무조건 넣기 (i=0)
}else {
int randomNum = random.nextInt(placeList.size());
idx[i] = randomNum;
}
}
//인덱스 배열이 완성되면 장소 가지고 오기
for(int i:idx) {
System.out.println(i);
//장소 가지고 오기
PlaceVO randomPlace = placeList.get(i);
//넣기
randomList.add(randomPlace);
}
}
배운점 :
조건문은 조건식이 true일때 돈다. 따라서 checkSame이 현재 false이고 조건식은 (!false)가 되므로(true)이다.
따라서 if의 조건식이 true가 되므로 실행문을 타게된다.
이처럼 조건문안의 조건식을 만족시켜서 사용하는 것 뿐만 아니라 boolean 값을 두고,
그 값이 true이냐 false이냐로 돌릴 수도 있다.
반응형