2017-10-11 9 views
1

私はAndroidで新しく、今日は本当に動機づけられているので、私はアプリを書くようになりました。ArrayListの削除と縮小

しかし、私は立ち往生しています...私はそれに文字列でArrayListを持っています。乱数ジェネレータでは、このリストからStringを取得します。 本当にやりたいことは、ストリングの繰り返しを避けることです。私は要素を一度しか見たくありません。

あなたは私を助けてくれますか?ここで

は私MainActivityです:

public class MainActivity extends AppCompatActivity { 

private TextView welcomeText; 
private TextView pokemons; 
private TextView whatToDo; 
private Button yesButton; 
private Button noButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final String[] pokemonok = { 
      "Pikachu", 
      "Charizard", 
      "Bulbasaur", 
      "Charmander", 
      "Squirtle", 
      "Caterpie", 
      "Metapod", 
      "Weedle", 
      "Rattata", 
      "Onix" 
    }; 

    final List<String> list = new ArrayList<String>(pokemonok.length); 
    for (String s : pokemonok) { 
     list.add(s); 
    } 

    welcomeText = (TextView) findViewById(R.id.welcomeText); 
    pokemons = (TextView) findViewById(R.id.pokemons); 
    whatToDo = (TextView) findViewById(R.id.whatToDo); 
    //EditText answerText = (EditText) findViewById(R.id.answerText); 
    yesButton = (Button) findViewById(R.id.yesButton); 
    noButton = (Button) findViewById(R.id.noButton); 

    final String[] def = {"[ " + list.get(0) + " ]"}; 
    pokemons.setText(def[0]); 

    View.OnClickListener igen = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Random r = new Random(); 
      int szam = r.nextInt(pokemonok.length); 

      pokemons.setText(def[0] + "[ " + list.get(szam) + " ]"); 
      def[0] = def[0] + "[ " + list.get(szam) + " ]"; 

     } 
    }; 

    yesButton.setOnClickListener(igen); 

    } 
} 
+0

をチェックするので、あなたは一度、各ポケモンを手にしたいですか? –

答えて

1

、あなたは元のリストからオブジェクトを読み込むたび、一時リストにその要素を追加します。これに。次に、新しいランダム要素を選択するときは、まず、その要素がすでに一時リストにあるかどうかをチェックする必要があります。はいの場合は、プロセスを再生成する必要があります。

List<String> tempList = new ArrayList<>(); 
tempList.add(// YOUR ELEMENT TO SAVE ON TEMP LIST //); 

はその後

if (tempList.contains(element)){ 
     // your code to doing the process again 
{ 
1

あなたがランダムNUMジェネレータの設定方法によっては、このような何かを行うことができます:

list.remove(randomNumber); 

これは、リストから項目を削除する必要があります。

2

あなたがそれにアクセスした後、リストから要素を削除したい場合は、このリストからi番目の要素を削除します

list.remove(i) 

を呼び出すことができます。

0

あなたは、あなたがポケモンを既に選んされている識別し、あなたのクラスのboolean配列作成することができ、あなたのポケモンの文字列リストを変更したくない場合は、次の

private boolean[] pokemonPicked = new boolean[pokemonok.length]; 

を、あなたのclickListener方法を変更することができますあなたがリストを維持したい場合は、別のリストを持つことができます

View.OnClickListener igen = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 

     int r = new Random().nextInt(pokemonok.length); 
     while(pokemonPicked[r]){ 
      r = new Random().nextInt(pokemonok.length); 
     } 
     pokemonPicked[r] = true; 
     int szam = r; 

     pokemons.setText(def[0] + "[ " + list.get(szam) + " ]"); 
     def[0] = def[0] + "[ " + list.get(szam) + " ]"; 

    } 
}; 
+0

これは非効率的です。有効な番号が選択されるのを待つ間に任意の遅延が生じる可能性があります。 –

+0

私はそれもやってみることをお勧めしませんが、実際には乱数が均等に分配されるため、これは比較的うまく機能します。最悪の場合、これはもちろん間違っている可能性があります。 –

+0

この比較的低い数値の場合は、おそらく問題ありません。非常に多くのポケモン(数百万のような)でこれを行っていたのなら、結局は問題になるでしょう。 –

関連する問題