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이냐로 돌릴 수도 있다.

반응형