1

アプリがテキスト ファイルからランダムな行を読み取って返すメソッドがあります。randTxt() を使用して、txt ファイルからランダムな行を読み取って返します。しかし、毎回同じ行(1行目)しか表示されません。

public String randTxt(){

  // Read in the file into a list of strings
  InputStreamReader inputStream = new InputStreamReader(getResources().openRawResource(R.raw.randomstuff));
  //ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

  String theLine="";
  int i;
  try {
    i = inputStream.read();
    while (i != -1) {
      i = inputStream.read();
    }
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }

  LineNumberReader  rdr = new LineNumberReader(inputStream);
  int numLines = 30;
  Random r = new Random();
  rdr.setLineNumber(r.nextInt(numLines));

  try {
    theLine = rdr.readLine();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }

  return theLine;
}

どうすれば修正できますか?誰かが私のコードの何が問題なのか説明できますか?

4

5 に答える 5

3

これが、BufferedReaderを使用して必要なことを行うためのフレームワークです。この場合、値を一時配列に格納する必要はありません。

InputStreamReader inputStream = new InputStreamReader
  (getResources().openRawResource(R.raw.randomstuff));
BufferedReader br = new BufferedReader(inputStream);
int numLines = 30;
Random r = new Random();
int desiredLine = r.nextInt(numLines);

String theLine="";
int lineCtr = 0;
while ((theLine = br.readLine()) != null)   {
  if (lineCtr == desiredLine) {
    break;
  }
  lineCtr++;
 }
...
Log.d(TAG, "Magic line is: " +theLine);
于 2012-01-02T20:44:16.517 に答える
3

コードを修正する方法についての回答は得られましたが、元のコードが機能しなかった理由についての説明はありません。

LineNumberReader.setLineNumber(int) は実際の行には移動しません。現在の行を呼び出す番号を変更するだけです。

したがって、2 行を読み取ったとします。getLineNumber()は 2 を返します (0 から始まり、改行が発生するたびに 1 ずつ増加します)。setLineNumber(10)の場合、getLineNumber()は 10 を返します。さらに別の行 (3 番目) を読み取ると、 getLineNumber()は 11 を返します。

これはJava Docで説明されています。

于 2012-01-02T22:11:47.900 に答える
2

inputStream.read は行番号を返しません。読み取ったバイトを返します。これは、行ごとに読む方法ではありません。行ごとに読み取るには、バッファリングされたリーダーの readLine メソッドを使用する必要があります。その時点で、行番号リーダーを使用するよりも、すべてをローカル配列に読み取り、その配列を使用してランダムにエントリを取得する方がおそらく簡単です。

于 2012-01-02T20:03:47.893 に答える
0
public String getRandomLine(String fileLoc) throws IOException
{
    BufferedReader reader = new BufferedReader(new FileReader(fileLoc));
    ArrayList<String> lines = new ArrayList<String>();

    String line =null;
    while( (line = reader.readLine())!= null ) 
        lines.add(line);

    // Choose a random one from the list
    return lines.get(new Random().nextInt(lines.size()));
}
public String getRandomLineOpt(String fileLoc)throws IOException
{
    File f=new File(fileLoc);
    RandomAccessFile rcf=new RandomAccessFile(f, "r");
    long rand = (long)(new Random().nextDouble()*f.length());
    rcf.seek(rand);
    rcf.readLine();
    return rcf.readLine();
}
于 2013-02-13T15:19:09.907 に答える
0

Random() 関数は 0 から 1 の間の値を返すと思います。したがって、整数値を取得するには 100 を掛ける必要がある場合があります。最終的に取得したインデックスが 0 と上限の間にあることを保証するために、MOD の「上限」操作を検討することもできます

このように計算したインデックスを setLineNumber() メソッドで使用します。

編集: ジョンが言ったように、Random() オブジェクトを使用して整数を取得できます。

于 2012-01-02T20:02:47.317 に答える