아 이미지 왜 자꾸 깨짐.

이미지 자꾸 깨지니까 그냥 말로하겠음 ...딱히 할말이없네요 이미지올리고싶은데
ps&cube
접속 : 6146   Lv. 86

Category

Profile

Counter

  • 오늘 : 122 명
  • 전체 : 440019 명
  • Mypi Ver. 0.3.1 β
[학생] java ArrayList쪽 코딩에서 왜 에러나는지 모르겠습니다. (6) 2015/10/08 PM 10:07

로직은 분명 맞다고 생각됩니다만...
자꾸 삐꾸가 나네요...
매개변수로 주어진 값은 1입니다...매개변수인 1이 아닌값으로 0~6의 숫자를 가진 (a.size() 가 7) 3개의 정수를 발생시켜서 resultList에 중복이 없이 리턴하는것이 목표입니다...한번 보고 지적해주시면 감사하겠습니다.
다른 더 간단한 방법있으시면 알려주시면 또 감사하겠씁니다.

2번째 컴파일해서 나온거보면...
3개 잘만들고 중복없는지까지 체크했는데...갑자기 한숫자가 추가되었네요 ㅜㅠ 루프가 한번더돈거같은데..
3번째 컴파일해서 나온거보면
3개 만들고 if로 해서 중복 체크하는 쪽으로 넘어가지 않고 거기서 진행이 안되네요..

코드는 다음과 같아요.

public ArrayList randomIndex(int answerIndex){
ArrayList resultList=new ArrayList();
int count=0;
int index;
//3개를 뽑는데, answerIndex를 제외한 경우에 3개를 중복되지 않게 뽑음.(answerIndex는 1로 주어짐)
do{
count++;
index=(int)(Math.random()*a.size());
resultList.add(index);
System.out.println(resultList);
System.out.println(resultList.size());
if(resultList.contains(answerIndex)){
System.out.println("카운트는 "+count);
resultList.remove(count-1);//만약에 resultList에서 추가된 값이 1과 같으면 그 값을 삭제하고 count도 줄임.
count--;
break;
}

if(resultList.size()==3){ //1의 값이 제외된 3자리 수가 나오면 3자리끼리 중복되지 않도록 함.
do{
if(resultList.get(0)==(1))
resultList.add(1, index);
if(resultList.get(1)==(2))
resultList.add(2, index);
if(resultList.get(0)==(2))
resultList.add(0, index);

if((resultList.get(0)!=resultList.get(1))&&(resultList.get(1)!=resultList.get(2)&&resultList.get(0)!=resultList.get(2))){
System.out.println("3개의 서로 다른 숫자 생성 완료");
break;
}
}while(true);


System.out.println("루프 끝");
break;
}

if(count==3){
System.out.println("루프를 빠져나가고 결과를 출력합니다.");
break;
}
}while(true);



System.out.println("결과는 "+resultList);





신고

 

dibidip    친구신청

로직을 수정하는게 좋아보입니다. 일단 처음부터 랜덤값 만든다음에 리스트에 넣고 매개변수와 비교하는데 리스트에 넣기전에 비교해서 1이 아니면 넣도록 수정하구..

중복되지 않도록 하는것도 리스트에 넣기전에 이미 리스트에 들어가있는 값들과 foreach문으로 전부 비교해서 검사하는게 더 좋아보입니다.

요는 리스트에 넣기전에 검사를 전부 한 후에 넣는다는 겁니다.

dibidip    친구신청

그리고 do~while(true)로 묶여있는데 이건 사실상 while(true)만 쓰는것과 같습니다.

ps&cube    친구신청

for( int i : resultList)
로 해서 i를 뺀다음에 그 i끼리 비교하는게 가능한가요?

dibidip    친구신청

아맞다.. 리스트에는 contains메소드가 있죠 배열이랑 햇갈려서 이상한소리 했네요 foreach는 무시하셔도 될거같습니다. contains같은 도구가 없다고 치면

int rand = ~~//랜덤값
bool overlaped = false; //중복 검사
for(int val : resultList) {
if(val == choice)
overlaped = true;
}

overlaped 가 true면 중복된거고 그대로 false면 중복되지 않은 숫자니 리스트에 넣ㅇ면 됩니다.


라베르시엘    친구신청

돌릴때마다 count 몇인가 뿌려서 확인해보세요
루프를 빠져나가고 결과를 출력합니다. 도 출력이 안되고 있으니까..
전체적으로 다시 생각하시는게 좋을거 같긴한데

이마도꼬    친구신청

public ArrayList<Integer> randomIndex(int answerIndex)
{
ArrayList<Integer> numbers = new ArrayList<Integer>();

Random random = new Random();
int counter = 0;
int choice;
while (counter < 3) {
choice = random.nextInt(4) + 1; // 1부터 4까지
if (numbers.contains(choice) || choice==answerIndex) {
continue;
}
numbers.add(choice);
counter++;
}

return numbers;
}
X