0

これについてかなりの数の検索を行いましたが、適用されない実装しか見つけることができません (たとえば、既に持っているランダムを使用しています)。かなり新人な質問です。どんな助けでも大歓迎です。

文字列配列を取得し、現在、ボタンの onCLick 値として実装した単純な関数 (以下のコード) を介してランダムな配列を返します。したがって、誰かがボタンをクリックするたびに、新しい文字列が設定されます。

代わりに、配列を上から下に調べて、一度に 1 つの文字列を返し、最初からやり直すことをお勧めします。これを行うにはいくつかの方法があると思いますが、何か提案はありますか? よろしくお願いします!

public class FirstActivity extends Activity {

  private TextView myStringView;
  private static final Random RANDOM = new Random();
  String myString;


  //....my other code


  private static final String[] MYSTRINGS = {
      "string a",
      "string b",
      "string c"
  };

   public void generateString(View v) {

      int myStringsLength = MYSTRINGS.length;
      String myString = MYSTRINGS[RANDOM.nextInt(myStringsLength)];
      myStringView.setText(myString);

  }
}
4

6 に答える 6

5

独自の関数を作成します。

 private static int counter = 0;

 private int nextInt(int length) {
     return (counter++) % length;
 }

代わりにそれを呼び出すだけですRANDOM.nextInt()

于 2013-02-19T13:39:57.033 に答える
1

これはうまくいくはずです:

public class FirstActivity extends Activity {

  private TextView myStringView;
  private int stringIndex;
  String myString;


  //....my other code


  private static final String[] MYSTRINGS = {
      "string a",
      "string b",
      "string c"
  };

   public void generateString(View v) {

      int myStringsLength = MYSTRINGS.length;
      String myString = MYSTRINGS[stringIndex];
      stringIndex = (stringIndex + 1) % myStringsLength;
      myStringView.setText(myString);

  }
}
于 2013-02-19T13:40:37.747 に答える
1

基本的に、循環配列を実装したいと考えています。クラスにカウンターを保持することでこれを行うことができます。

public void generateString(View v) 
{
    int index = count % MYSTRINGS.length;
    count++;

    String myString = MYSTRINGS[index];
    myStringView.setText(myString); 
}
于 2013-02-19T13:41:00.077 に答える
0

Iterator永遠にループする を書くことができます:

public class Test {
  public static void main(String args[]) {
    System.out.println("Test");
    new Test().test();
  }

  public void test() {
    String[] strings = {"One",
      "Two",
      "Three"};
    for (Iterator<String> s = new ArrayIterator<>(strings); s.hasNext();) {
      System.out.println(s.next());
    }
    int i = 0;
    for (Iterator<String> s = new ArrayIterator<>(strings, true); i < 10 && s.hasNext(); i++) {
      System.out.println(s.next());
    }
  }

  static class ArrayIterator<T> implements Iterator<T> {
    private final T[] array;
    private boolean loop = false;
    private int i = -1;
    private T next = null;

    public ArrayIterator(T[] array, boolean loop) {
      this.array = array;
      this.loop = loop;
    }

    public ArrayIterator(T[] array) {
      this(array, false);
    }

    @Override
    public boolean hasNext() {
      if (next == null) {
        // Step 1.
        i += 1;
        if (i == array.length) {
          if (loop) {
            i = 0;
          }
        }
        next = (i < array.length ? array[i] : null);
      }
      return next != null;
    }

    @Override
    public T next() {
      T it = next;
      next = null;
      return it;
    }

    @Override
    public void remove() {
      throw new UnsupportedOperationException("Not supported.");
    }
  }
}

版画:

One
Two
Three
One
Two
Three
One
Two
Three
One
Two
Three
One
于 2013-02-19T13:53:03.210 に答える
0

静的カウンターがそのトリックを行います。

public class FirstActivity extends Activity {

  private static int counter = 0;      

  private TextView myStringView;
  private static final Random RANDOM = new Random();
  String myString;


  //....my other code


  private static final String[] MYSTRINGS = {
      "string a",
      "string b",
      "string c"
  };

   public void generateString(View v) {

      String myString = MYSTRINGS[counter++];
      if( counter == MYSTRINGS.length ) {
          counter = 0;
      }
      myStringView.setText(myString);

  }
}
于 2013-02-19T13:40:25.477 に答える
0

実際、これを達成するにはいくつかの方法があります。私が理解しているように、問題の最善の解決策は、到達した配列内の現在の文字列を表すカウンターを保持し、対応する文字列値を返すことです。

String[] arr = new String[] {"a", "b", "c"};
int counter = 0;

public String getStringFromArr() {

    if(counter < arr.length) {
        return arr[counter++];
    } else {
        counter = 0;

        return arr[counter++];
    }
}

これは、最も単純な実装だと思います。これをさらに抽象化して、文字列の配列を受け取り、使用する文字列を返す nextString() メソッドを公開するクラスに配置できます。

また、良い点は、String[] の代わりに List を使用することです。

メソッドから getStringFromArr() を呼び出す必要があります。

于 2013-02-19T13:47:26.590 に答える