2014-02-28 3 views
-1

나는 안드로이드에서 간단한 무작위 퀴즈 앱을 사용하고 있습니다. 그래서 기본적으로 나는 문자열 배열을 가지고 있습니다. 반복하지 않고 문자열을 표시해야합니다.안드로이드는 반복없이 문자열을 무작위로 배열합니다.

String[] words = { "Welcome", "Different", "Teenager", "Transfer", "Italian", 
        "Timber", "Toxic", "Illiterate", "Irate", "Moderate", "Transportation", "Attention" }; 


ArrayList<String> wordlist = new ArrayList<String>(); 
for (String i : words) 
    wordlist.add(i); 
Collections.shuffle(wordlist); 

randomStr = words[new Random().nextInt(words.length)]; 

tvWord.setText(""); 
tvWord.setText(randomStr); 

을하지만 여전히 반복 임의의 단어를 얻을 : 이것은 내가 지금까지 시도한 것입니다. 여기서 내가 뭘 잘못하고 있니? 어떤 아이디어? 기꺼이 도와 주시면 감사하겠습니다. 감사.

업데이트 : 다음 표시되어야 단어를 클릭 버튼에

첫째. 그리고 여러 번 나는 버튼을 클릭하여 같은 단어를 다시 읽습니다.

switch(v.getId()){ 
    case R.id.btPlay: 
     randomWordList(); 
     break; 
} 

randomWordList(); 위에 게시 한 방법입니다.

+0

배열 목록을 임의로 뒤섞어서 사용하지 마십시오. 그러므로 그 후에 루프 할 수 있습니다. – njzk2

답변

2

이미 사용 된 것을 추적하지 않습니다. 또한 단어 목록을 정의한 다음 단어 목록을 사용하지 않는 이유를 이해하지 못합니다. 코드를 조금만 수정하면 트릭을 수행 할 수 있습니다.

편집 : 값을 사용하는 것과 다른 범위에서 값을 초기화해야합니다. 예를 들면 다음과 같습니다.

public class MyClass{ 

LinkedList<String> wordlist; 

public MyClass(){ 
    String[] words = { "Welcome", "Different", "Teenager", "Transfer", "Italian", 
       "Timber", "Toxic", "Illiterate", "Irate", "Moderate", "Transportation", "Attention" }; 
    wordlist = new LinkedList<String>(); 
    for (String i : words) 
     wordlist.add(i); 
    Collections.shuffle(wordlist); 
} 

public void useNextWord(){ 
    tvWord.setText(""); 
    tvWord.setText(wordlist.pollLast()); 
} 
+0

나는 이것을 시도했다. 그러나 버튼을 여러 번 클릭 할 때 단어가 다시 반복을 계속한다. – Dunkey

+0

그 이상을 게시해야한다.이것이 한 가지 방법이라면 효과가 없습니다. 단어는 다른 곳에서 초기화되어야합니다 (일부 init 메소드 또는 생성자). 그렇지 않으면 이미 사용 된 정보가 손실됩니다. – NeplatnyUdaj

+0

내 게시물이 업데이트됩니다. – Dunkey

0

이미 다른 배열이나 목록에서 사용한 문자열을 추적하고 값이 아직 사용되지 않았는지 확인하거나 또는 사용 된 문자열을 풀에서 제거해야합니다. String next = List.remove(index)을 사용하면됩니다.

+0

공간과 시간면에서 효율성은 문자열이 아닌 사용 된 ID를 추적하는 것이 좋습니다. – Tautvydas

0

먼저 목록을 Collections.shuffle(wordlist);으로 섞은 다음 임의의 색인으로 목록에 액세스하십시오. 이미 목록이 섞여 있으면 임의의 색인을 사용할 필요가 없습니다. 그냥 한 항목을 다른 항목으로 가져옵니다. 목록이 비어있을 때까지 wordlist.remove(0)을 사용할 수 있습니다.

표시는 다음 문자열은 다음과 같습니다

if (!wordlist.isEmpty()) { 
    randomStr = wordlist.remove(0); 
    tvWord.setText(randomStr); 
} 
+0

이것을 구현할 수 있습니까? – Dunkey

+0

@Dunkey : 내 대답이 업데이트되었습니다. 이것은 shuffled 목록에서 다음 문자열을 검색하고 표시하는 방법입니다. 문자열이 목록에서 제거되어 두 번 표시되지 않습니다. – Claus

1

Strings의 새 목록을 만들고 임의로 만듭니다. 그런 다음 처음부터 순서대로 반복합니다.

ArrayList<String> copyOfWords= new ArrayList<String>(words); 
Collections.shuffle(copyOfWords); 

이는 here에서 가져옵니다. 시간 복잡도는 O (n)입니다.

List을 반복하려면 첫 번째 요소를 가져 와서 (동일한 방법으로) 제거하거나 마지막으로 사용한 요소를 추적하십시오.

최초의 솔루션 :

String randomWord = copyOfWords.remove(0); 
tvWord.setText(randomWord); 

P.S. 코드에이 줄을 사용하지 마십시오. randomStr = words[new Random().nextInt(words.length)];

+0

그래서 어떻게 내 textview에 단어를 표시 할 수 있습니까? – Dunkey

+0

답변을 업데이트했습니다. 희망이 도움이됩니다. – Tautvydas

관련 문제