前提・実現したいこと
Androidstudioで加速度センサーの値とテキストファイルの値で演算するプログラムを作っています。ファイルの値は読み込めますが配列へ格納する方法がわかりません。やりたいことは以下の通りです。
テキストファイルを読み込み配列へ格納する。そして加速度センサーで検知された値と演算する。読み込みたいテキストデータは以下のような感じです。
1 5 8
2 6 7
3 9 10
余分なimport文が何個かありますが、お願いいたします。
発生している問題・エラーメッセージ
str下線部に Valiable ‘str might not have been initialized
parseInt下線部に Cannot resolve method
parseInt`(java.lang.String[])
というエラーが出ています。
該当のソースコード
Java
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import static com.example.mlab_win.spleadsheet3.R.id.text;
import static com.example.mlab_win.spleadsheet3.R.id.textView;
class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAcceleration;
private TextView[] mSensor = new TextView[3];
InputStream is = null;
BufferedReader br = null;
String text = "";
int Index[][] = new int[325557][];
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// センサーマネージャの取得
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor[0] = (TextView) findViewById(R.id.xValue);
mSensor[1] = (TextView) findViewById(R.id.a);
mSensor[2] = (TextView) findViewById(R.id.zValue);
TextView textView =(TextView)findViewById(R.id.a);
}
@Override
protected void onResume() {
super.onResume();
// 使用するセンサーの設定
Sensor acceleration = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// センサーを有効にする
mSensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_NORMAL);
try {
try {
// assetsフォルダ内の sample.txt をオープンする
is = this.getAssets().open("sample.txt");
br = new BufferedReader(new InputStreamReader(is));
String str;
while(str != null){
//strlist.add(str.split(","));
//一行の内容を','で分割してそれぞれを[count=ノード番号]の2次元目の配列の要素として格納
Index[count] = parseInt(str.split(","));
//次の行を読み込み
str = br.readLine();
count++;
}
br.close();
} finally {
if (is != null) is.close();
if (br != null) br.close();
}
} catch (Exception e){
// エラー発生時の処理
}
}
@Override
protected void onPause() {
super.onPause();
// センサーを無効にする
if (mSensorManager != null) {
mSensorManager.unregisterListener(this);
}
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// センサーの精度が変化した場合に呼ばれる
}
@Override
public final void onSensorChanged(SensorEvent event) {
// センサーの値が変化した場合に呼ばれる
float [] accell= new float[3];
accell[0] = event.values[0];
accell[1] = event.values[1];
accell[2] = event.values[2];
Log.i("加速度", "accell[X] " + accell[0]);
Log.i("加速度", "accell[Y] " + accell[1]);
Log.i("加速度", "accell[Z] " + accell[2]);
}
}
補足情報(言語/FW/ツール等のバージョンなど)
Androidstudio 2.2.3
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
1つめのエラーメッセージ「str下線部に Valiable ‘str might not have been initialized」は、「変数 strが初期化されていません(初期化されていないので、値が判りません)」という事です。
このエラーは、onResumeメソッドのコードの以下の箇所が原因です。
String str;
while(str != null){
変数 strが宣言されて、値が代入されていない状態の時に、while文の条件式 「str != null」が評価されます。strの値が不定なので、確実な判断が出来ません。
これは、whileループが始まる前に、strに値を代入していない事が原因ですから、下記のように修正すれば解決すると思います。
String str;
str = br.readLine(); /* Whileループの前に、ファイルから最初の行を読み出して strに代入しておく */
while(str != null){
=====
2つめのエラーメッセージ「parseInt下線部に Cannot resolve method parseInt`(java.lang.String[]) 」は、引数が文字列の配列であるparseIntというメソッドは無い(見当たらない)という意味です。
parseIntは、引数が1つの文字列であるもの(文字列を10進数の文字表現だと解釈して数値を返します)と、引数の1つ目が文字列、2つ目が基数であるもの(文字列を指定された基数の値の文字表現として解釈して数値を返す。16進文字列を数値に変換する場合などに使う)の2種類しかありません。
また、onResumeメソッドのコードの以下の箇所は、端折りすぎです。
Index[count] = parseInt(str.split(","));
たぶん、以下のような事がしたかったのではないかと推測します。
int xyz;
String splitted[3];
splitted = str.split(" "); /* 質問のテキストの例では、値がスペースで区切られていますから、スペースで分割(split)しました */
for (xyz=0; xyz<3; xyz++) {
Index[count][i] = parseInt(splitted[xyz]);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
提示されているコードにparseIntというメソッドが見当たらないですね。
Integer.parseIntの誤りじゃないですか?
また、Integer#parseIntは引数に配列は取れませんよ。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/20 18:48