質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2986閲覧

android studio CSVファイルを読み込んでおき、特定の文字が入力されたら対応する文字を出力したい

sekaikan_ozaki

総合スコア65

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/05/21 02:34

編集2019/05/23 01:46

PCスペック
Windows7 64bit
メモリ 8GB
プロセッサ Intel Core i7-3610

Android Studio 3.4

android studioで

1.CSVファイルを読み込んでおく
2.画面右上で条件を選択
3.ExitTextで文字を入力して検索ボタンをクリック
4.入力された文字がCSVファイルの中にあれば、「その文字」&「同じ行の違う列の対応する情報」をTextViewで出力

上のような機能を実装したいです。

3までは一応実装済みです。

写真はとりあえず、中身をすべて表示しているだけです。
![イメージ説明

具体的には、
ほしい情報として画面右上の選択で「気温」を選択しているときに、「1時」と入力すると、「1時」&「21度」がTextViewで出力されるみたいな感じです。

現時点でのソースコードはこんな感じです。

java

1package com.example.csvread3; 2 3import android.support.v7.app.AppCompatActivity; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.AdapterView; 7import android.widget.ArrayAdapter; 8import android.widget.Button; 9import android.widget.EditText; 10import android.widget.ListView; 11import android.widget.Spinner; 12import android.widget.TextView; 13 14import java.io.BufferedReader; 15import java.io.IOException; 16import java.io.InputStream; 17import java.io.InputStreamReader; 18import java.util.ArrayList; 19import java.util.Iterator; 20import java.util.List; 21import java.util.StringTokenizer; 22 23 24public class MainActivity extends AppCompatActivity { 25 26 //リストの宣言 27 private ArrayList<String> timeList; 28 private ArrayList<String> tempList; 29 private ArrayList<String> amountList; 30 31 //アダプターの宣言 32 private ArrayAdapter arrayAdapter; 33 private ArrayAdapter arrayAdapter2; 34 private ArrayAdapter arrayAdapter3; 35 36 private TextView textView;//適合した際に文章を表示 37 private EditText editText;//時刻を入力 38 String text;//入力内容 39 String item;//気温or電車の本数 40 41 42 private String spinnerItems[] = {"選択", "気温", "電車"};//スピナー 43 //private TextView SpinnertextView;//現在のスピナーで選んでるやつの表示用 44 45 @Override 46 protected void onCreate(Bundle savedInstanceState) { 47 super.onCreate(savedInstanceState); 48 setContentView(R.layout.activity_main); 49 50 //フレームワーク作成 51 timeList = new ArrayList<String>(); 52 tempList = new ArrayList<String>(); 53 amountList = new ArrayList<String>(); 54 55 //CSVを読み込んでおく 56 readCSV(); 57 58 //アプリにCSVの中身を表示するためのインスタンスを作成 59 ListView listView = (ListView) findViewById(R.id.list_view1); 60 ListView listView2 = (ListView) findViewById(R.id.list_view2); 61 ListView listView3 = (ListView) findViewById(R.id.list_view3); 62 63 //時刻の情報 64 arrayAdapter = 65 new ArrayAdapter( 66 this, R.layout.list_item_layout , timeList); 67 //気温の情報 68 arrayAdapter2 = 69 new ArrayAdapter( 70 this, R.layout.list_item_layout , tempList); 71 //電車の本数 72 arrayAdapter3 = 73 new ArrayAdapter( 74 this, R.layout.list_item_layout , amountList); 75 76 //画面内に表示 77 listView.setAdapter(arrayAdapter); 78 listView2.setAdapter(arrayAdapter2); 79 listView3.setAdapter(arrayAdapter3); 80 81 //文字を入力 82 editText = findViewById(R.id.edit_text); 83 //入力した文字を表示する為の準備 84 textView = findViewById(R.id.text_view); 85 //ボタンの作成 86 Button button = findViewById(R.id.button); 87 88 //検索条件(気温or電車の本数)を選択 89 //SpinnertextView = findViewById(R.id.spinner_text_view); 90 Spinner spinner = findViewById(R.id.spinner); 91 92 // ArrayAdapter 93 ArrayAdapter<String> adapter 94 = new ArrayAdapter<>(this, 95 android.R.layout.simple_spinner_item, spinnerItems); 96 97 //ユーザーが選択しようとするときにドロップダウンによりリストを表示するのに使うレイアウトを指定 98 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 99 100 // spinner に adapter をセット 101 spinner.setAdapter(adapter); 102 103 // リスナーを登録 104 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 105 // アイテムが選択された時 106 @Override 107 public void onItemSelected(AdapterView<?> parent, 108 View view, int position, long id) { 109 Spinner spinner = (Spinner)parent; 110 item = (String)spinner.getSelectedItem(); 111 //SpinnertextView.setText(item); 112 113 114 } 115 // アイテムが選択されなかった 116 public void onNothingSelected(AdapterView<?> parent) { 117 // 118 } 119 }); 120 121 122 //検索ボタンが押されたら 123 button.setOnClickListener(new View.OnClickListener() { 124 @Override 125 public void onClick(View v) { 126 // エディットテキストの文字を取得 127 text = editText.getText().toString(); 128 //入力された時刻と適合する時刻を探すメソッド 129 match(text); 130 131 } 132 }); 133 } 134 135 /** 136 * CSVの読み込み 137 */ 138 public void readCSV() { 139 try { 140 InputStream inputStream = 141 getResources().getAssets().open("data1.csv"); 142 143 InputStreamReader inputStreamReader = 144 new InputStreamReader(inputStream); 145 146 BufferedReader bufferReader = 147 new BufferedReader(inputStreamReader); 148 149 String line = ""; 150 151 while ((line = bufferReader.readLine()) != null) { 152 StringTokenizer stringTokenizer = 153 new StringTokenizer(line, ","); 154 155 timeList.add(stringTokenizer.nextToken()); 156 tempList.add(stringTokenizer.nextToken()); 157 amountList.add(stringTokenizer.nextToken()); 158 } 159 bufferReader.close(); 160 } catch (IOException e) { 161 e.printStackTrace(); 162 } 163 } 164 165 //入力された文字(時刻)と適合する時刻を探すメソッド 166 public void match(String text){ 167 //時刻の情報を1番目から最後まで回す 168 for(String s : timeList){ 169 //入力情報と一致したら 170 if(text == s){ 171 if(item == spinnerItems[1]){//スピナーで選択した条件が「気温」だったら 172 textView.setText(text+"の"+spinnerItems[1]+"は○○です"); 173 }else if(item == spinnerItems[2]){//条件が「電車の本数」だったら 174 textView.setText(text+"の"+spinnerItems[2]+"は○○です"); 175 } 176 } 177 } 178 } 179}

現在のところ、edittextから受け取った文字をmatchメソッドにわたして、matchメソッドの中で、CSVファイルの時刻情報だけをfor文で回したときに、入力情報と一致すれば画面に、気温or電車の本数の情報をとりあえず表示させたいのですが、アルゴリズムがおかしいせいか「1時」と入力しても画面上に何も表示されません。。。

間違っている箇所がありましたら教えていただけませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/05/21 06:43

> CSVの読み込み方すら分からない そちらからまず調査・実装しては如何でしょうか.
sekaikan_ozaki

2019/05/21 17:18

やってみましたが、 xmlファイルにてエラーが出てしまいまして、そちらに関して別に質問立てました
jimbe

2019/05/22 12:00

大分進みましたですね. >「気温」を選択しているときに、「1時」と入力すると とありますが, 画面にもコードにも気温を選択している様子はありません. これは「とりあえず気温を選択していることにして」作られていると考えてよろしいでしょうか.
sekaikan_ozaki

2019/05/23 01:06

その部分についても実装してみました。 「気温」と「電車の本数」をアプリ画面右上で選べるようにしました。
sekaikan_ozaki

2019/05/23 01:13

質問のコードとアプリ画面の修正しました
jimbe

2019/05/23 01:38

すいません, 機能が足りないと言いたかったわけではありませんでした. 説明とコードに差がありましたので, どちらが正しいのかということでした. 今さらですが, 動作しない状態で機能を追加するのはお勧めできませんので...
sekaikan_ozaki

2019/05/23 01:58

確かにそうですよね。。 すみません、 以後気をつけます!
guest

回答1

0

ベストアンサー

java

1 //ボタンが押されたら 2 button.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 // エディットテキストの文字を取得 6 text = editText.getText().toString(); 7 // 取得したテキストを TextView に張り付ける 8 //textView.setText(text); 9 } 10 }); 11 12 //入力された時刻と適合する時刻を探すメソッド 13 match(text);

となっていますが, なぜ match メソッドの呼び出しが onClick メソッドの外なのでしょうか.
ボタンが押されたら検索・表示を行うのではないのですか.


追記:

間違っている箇所がありましたら

これだけ出来る方なので, 落ち着いて確認されればお分かりになると思います.

java

1 //入力情報と一致したら 2 if(text == s){ 3 if(item == spinnerItems[1]){//スピナーで選択した条件が「気温」だったら 4 textView.setText(text+"の"+spinnerItems[1]+"は○○です"); 5 }else if(item == spinnerItems[2]){//条件が「電車の本数」だったら 6 textView.setText(text+"の"+spinnerItems[2]+"は○○です"); 7 } 8 }

この中で「java としては」やりたいことと記述が違っている箇所はどこでしょうか.

投稿2019/05/22 12:03

編集2019/05/23 02:00
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekaikan_ozaki

2019/05/23 01:12

ご指摘ありがとうございます 確かに言われてみるとそうでした。。。 コードを加筆・修正したのですが、「1時」と入力しても、「気温」or「電車の本数」のテキストが表示されないです。 コード自体にエラーは無く実行できるので、おそらくmatchメソッドがちゃんと機能してないのかと思われますが、おかしい点などありませんでしょうか...?
sekaikan_ozaki

2019/05/23 02:02

match メソッドの呼び出しの場所を onClick メソッドの中にしたのですが、表示がうまくいかないみたいです。。
sekaikan_ozaki

2019/05/23 02:37

textviewの文章内の○○は後から追加する内容なので、ここは関係ないとしておきますと、「やりたいことと記述が違っている箇所」という意味ではどこが違っているのか30分ほど考えてみましたが、ちょっと見当がいまだにつかないです。。 jimbe様の、ご指摘を上手く解釈できてない自分がもどかしいです
sekaikan_ozaki

2019/05/23 02:40

ちなみに、 //入力された文字(時刻)と適合する時刻を探すメソッド public void match(String text){ //時刻の情報を1番目から最後まで回す for(String time : timeList){ //入力情報と一致したら if(text == time){ if(item == spinnerItems[1]){//スピナーで選択した条件が「気温」だったら textView.setText(text+"の"+spinnerItems[1]+"は○○です"); }else if(item == spinnerItems[2]){//条件が「電車の本数」だったら textView.setText(text+"の"+spinnerItems[2]+"は○○です"); } }else{ textView.setText("時刻が間違っています"); } } } メソッドをこのように書き換えた状態で、「1時」と入力すると、 「時刻が間違っています」と表示されてしまったので、そもそも入力情報とも一致してないことが判明してますますよくわからなくなってきました。。
jimbe

2019/05/23 03:19

なかなか視点を変えるのも難しい時もありますね. if で else に行ってしまうということは, 条件式があっているか, もしくは「判定方法があっているか」...ということを確認してみては如何でしょうか.
sekaikan_ozaki

2019/05/23 05:44

jimbe様が思っているほど私は頭が賢くないので、 一旦、上のコードのアルゴリズムを日本語で整理してみたいと思います笑 ①拡張for文を使って、timeListの要素を変数timeに入れて、回す。 ②判別方法として、timeListの要素である変数timeと、入力情報である変数textの値(両方ともString型)を比べて一致したら、「○時の○は○○です」と画面に表示して、breakでfor文を抜ける 要するに線形探索アルゴリズムになってるはずなのですが、自分では正しいと思っている(頭が固すぎる)だけに、なぜこれでまず1個目のif文(何を入力してもelseで返ってくる)が正しく判別されないのか謎です。 if文では、判別するtimeとtextが両方ともString型の変数になっているし、何も問題ないはずだと思うのですが... そういえばよく考えてみると、for文が終わってからでないと、テキスト表示したなと思い、for文の外で表示するように書き換えてみました。 ```java //入力された文字(時刻)と適合する時刻を探すメソッド public void match(String text){ int find = -1; //時刻の情報を1番目から最後まで回す for(String time : timeList){ if(time == text){//入力情報と一致したら find =1; break; } } if(find == 1) { if(item == spinnerItems[1]) {//スピナーで選択した条件が「気温」だったら textView.setText(text + "の" + spinnerItems[1] + "は○○です"); }else if(item == spinnerItems[2]) {//条件が「電車の本数」だったら textView.setText(text + "の" + spinnerItems[2] + "は○○です"); } }else if(find == -1){ textView.setText("時刻が間違っています"); } } ``` これでも案の定」、for文の中のif文の判別式がおそらく正しくないせいで、「1時」と入力しても「時刻が間違っています」で返ってきます。。 難しいですね。 for文→拡張for文 配列→List を使ったことで判別式のやり方が変わってきたりするのでしょうか。。。
sekaikan_ozaki

2019/05/23 05:46

else ifはelseでも代用できますね笑
jimbe

2019/05/23 07:35

> jimbe様が思っているほど私は頭が賢くないので 賢さは分かりませんが, 申し上げました通り「視点を変える」難しさです. コメントされた文面から要所を抜き出しますと, > timeListの要素である変数timeと、入力情報である変数textの値(両方ともString型)を比べて一致したら > 自分では正しいと思っている です. 文字列の一致を判定するには '==' でよかったでしょうか.
sekaikan_ozaki

2019/05/23 07:54

jimbe様 このコメントを見た瞬間に衝撃が走りました。 完全に頭の中から抜け去っていたequalsメソッドを記述したことで、動作確認が取れました。 どこが原因かは推測できるのに、それがなぜダメなのかという理由をしっかり考え、すぐに間違いに気付けるようにならないといけないなと思いました。 今後もこういうことがたくさん起こると思うので、ちゃんと自力で気づけるようになっていきたいし、そのためにももっとプログラムに触れる機会を増やしていきたいと思います。 本当にありがとうございました
jimbe

2019/05/23 09:06 編集

equals のことは勿論ご存知だろうとの推測から, 気付いてさえ頂ければと少々意地の悪い回答/コメントが続いてしまってすいません. <(_ _;> text と s が(表示上)同じ文字列の時に `text == s` が true になっているかと疑うのは, `1+1=2` を疑うようでなかなか難しいと思います. 自分の間違いは分かり難いですが, 他人の間違いは案外気付くものです. teratail には(自称)初心者の方々のご質問もありますので, 試しに原因を究明してみますと, 「こんなこともある」「あんなこともある」と気付きの種を得られるのではと思います. その種がやがて「そういえばあの時こんな感じだった」と自身の気付きに成長するでしょう. 偉そうになってしまいますが, (機能追加の手際等)お力はあると思いますので, 今後も是非開発を続けて頂けたらと思います. お疲れ様でした.
sekaikan_ozaki

2019/05/23 09:32

jimbe様のご指摘の仕方はとてもありがたく、これからエンジニアとしてやっていく中で自分で考えて問題を解決できるようになっていきたいと思います。 まだまだAndroid開発が初心者で色々質問投稿することもあると思いますが、自分で考えられる範囲のことは、自力で考えてその分の成長に繋がていきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問