2012-07-13 3 views
0

나는 무작위 목록 셔플을 시도하고있다. 코드를 테스트하려고 할 때마다 본질적으로 아무 것도하지 않으며 끝나지 않습니다. 정확히 내가 무엇을 놓치고 잘못했는지 궁금 해서요.셔플 목록 무작위 자바

public static ListElement shuffle(ListElement head){ 
    int n= ListUtils.getLength(head); 
    ListElement head2= null; 
    while(head != null) { 
     int random = (int) Math.random() * n; 
     for(int i=0;i<random;i++){ 
      ListElement list= new ListElement(); 
      list=getItem(head2,n); 
      list.getNext(); 
      head2=list; 

     } 
    } 
    return head2;  
} 

를 GetItem

public static ListElement getItem(ListElement head, int n){ 
    if(n == 0){     
     return head;    
    }else if(head == null){  
     return null; 
    }else{      
     return getItem(head.getNext(),n-1); 
    } 
} 
+11

그냥'java.util.Collections.shuffle (myList에)' –

+0

어디'의 getItem()'의 코드는 사용할 수 있습니까? –

+0

Math.random()을 사용하는 방법을 배우고 싶습니다. – user1513323

답변

1

오타! 당신은 결코 당신이 당신의 루프 조건에서 사용 head를 업데이트하지 않습니다. 의 getItem 방법은 for 루프에서 무엇을

+0

끝에 머리를 어떻게 업데이트 할 것인지 잘 모르겠습니다. : – user1513323

+0

나도 마찬가지다. 나는 당신의 알고리즘이 너무 많은 의미를 가졌다 고 생각하지 않는다. 그러나 루프가 끝나지 않는 이유는 결코 당신이 결코 그것을 업데이트하지 않기 때문에'head'가 절대 null이되지 않기 때문이다. 언제나 당신이 '셔플'에 대한 논쟁으로 넘겨주세요. – Jochen

1

확실하지.

당신이 인 Math.random (사용하려는 경우 대체 솔루션) 전체 목록을 이동하고 목록에와 교환 할 각 요소에 대해 임의의 인덱스를 생성하는 것입니다.

public void randomize(List<String> myList){ 
    int n= myList.size(); 
    for(int i; i < n; i++){ 
    int randIdx = (int) Math.random() * n; 
    swap(myList, i, randIdx); 
    } 
} 

private void swap(List<String> list, int idx1, int idx2){ 
    if(idx1 != idx2){ //don't do swap if the indexes to swap between are the same - skip it. 
    String tmp = list.get(idx1); 
    list.set(idx1, list.get(idx2)); 
    list.set(idx2, tmp); 
    } 
}