0

我已经对此进行了很多搜索,但只能找到不适用的实现(例如,使用我已经拥有的随机)。漂亮的菜鸟问题,非常感谢任何帮助。

我得到了一个字符串数组,目前我通过一个简单的函数返回一个随机数组,我实现为按钮的 onCLick 值,代码如下。因此,每次有人点击 bottun 时,都会设置一个新字符串。

我想做的是从上到下遍历数组,一次返回一个字符串,然后重新开始。我怀疑可能有几种方法可以做到这一点,有什么建议吗?提前非常感谢!

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

静态计数器可以解决问题。

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() 方法。

还有一个好点是使用 List 而不是 String[]。

您现在应该从您的方法中调用 getStringFromArr()。

于 2013-02-19T13:47:26.590 回答
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 回答