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

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

ただいまの
回答率

90.34%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 243

sekaikan_ozaki

score 39

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で出力されるみたいな感じです。

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

package com.example.csvread3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;


public class MainActivity extends AppCompatActivity {

    //リストの宣言
    private ArrayList<String> timeList;
    private ArrayList<String> tempList;
    private ArrayList<String> amountList;

    //アダプターの宣言
    private ArrayAdapter arrayAdapter;
    private ArrayAdapter arrayAdapter2;
    private ArrayAdapter arrayAdapter3;

    private TextView textView;//適合した際に文章を表示
    private EditText editText;//時刻を入力
    String text;//入力内容
    String item;//気温or電車の本数


    private String spinnerItems[] = {"選択", "気温", "電車"};//スピナー
    //private TextView SpinnertextView;//現在のスピナーで選んでるやつの表示用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //フレームワーク作成
        timeList = new ArrayList<String>();
        tempList = new ArrayList<String>();
        amountList = new ArrayList<String>();

        //CSVを読み込んでおく
        readCSV();

        //アプリにCSVの中身を表示するためのインスタンスを作成
        ListView listView = (ListView) findViewById(R.id.list_view1);
        ListView listView2 = (ListView) findViewById(R.id.list_view2);
        ListView listView3 = (ListView) findViewById(R.id.list_view3);

        //時刻の情報
        arrayAdapter =
                new ArrayAdapter(
                        this, R.layout.list_item_layout , timeList);
        //気温の情報
        arrayAdapter2 =
                new ArrayAdapter(
                        this, R.layout.list_item_layout , tempList);
        //電車の本数
        arrayAdapter3 =
                new ArrayAdapter(
                        this, R.layout.list_item_layout , amountList);

        //画面内に表示
        listView.setAdapter(arrayAdapter);
        listView2.setAdapter(arrayAdapter2);
        listView3.setAdapter(arrayAdapter3);

        //文字を入力
        editText = findViewById(R.id.edit_text);
        //入力した文字を表示する為の準備
        textView = findViewById(R.id.text_view);
        //ボタンの作成
        Button button = findViewById(R.id.button);

        //検索条件(気温or電車の本数)を選択
        //SpinnertextView = findViewById(R.id.spinner_text_view);
        Spinner spinner = findViewById(R.id.spinner);

        // ArrayAdapter
        ArrayAdapter<String> adapter
                = new ArrayAdapter<>(this,
                android.R.layout.simple_spinner_item, spinnerItems);

        //ユーザーが選択しようとするときにドロップダウンによりリストを表示するのに使うレイアウトを指定
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // spinner に adapter をセット
        spinner.setAdapter(adapter);

        // リスナーを登録
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            // アイテムが選択された時
            @Override
            public void onItemSelected(AdapterView<?> parent,
                                       View view, int position, long id) {
                Spinner spinner = (Spinner)parent;
                item = (String)spinner.getSelectedItem();
                //SpinnertextView.setText(item);


            }
            // アイテムが選択されなかった
            public void onNothingSelected(AdapterView<?> parent) {
                //
            }
        });


        //検索ボタンが押されたら
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // エディットテキストの文字を取得
                text = editText.getText().toString();
                //入力された時刻と適合する時刻を探すメソッド
                match(text);

            }
        });
    }

    /**
     * CSVの読み込み
     */
    public void readCSV() {
        try {
            InputStream inputStream =
                    getResources().getAssets().open("data1.csv");

            InputStreamReader inputStreamReader =
                    new InputStreamReader(inputStream);

            BufferedReader bufferReader =
                    new BufferedReader(inputStreamReader);

            String line = "";

            while ((line = bufferReader.readLine()) != null) {
                StringTokenizer stringTokenizer =
                        new StringTokenizer(line, ",");

                timeList.add(stringTokenizer.nextToken());
                tempList.add(stringTokenizer.nextToken());
                amountList.add(stringTokenizer.nextToken());
            }
            bufferReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //入力された文字(時刻)と適合する時刻を探すメソッド
    public void match(String text){
        //時刻の情報を1番目から最後まで回す
        for(String s : timeList){
            //入力情報と一致したら
            if(text == s){
                if(item == spinnerItems[1]){//スピナーで選択した条件が「気温」だったら
                    textView.setText(text+"の"+spinnerItems[1]+"は○○です");
                }else if(item == spinnerItems[2]){//条件が「電車の本数」だったら
                    textView.setText(text+"の"+spinnerItems[2]+"は○○です");
                }
            }
        }
    }
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sekaikan_ozaki

    2019/05/23 10:13

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

    キャンセル

  • jimbe

    2019/05/23 10:38

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

    キャンセル

  • sekaikan_ozaki

    2019/05/23 10:58

    確かにそうですよね。。

    すみません、
    以後気をつけます!

    キャンセル

回答 1

checkベストアンサー

0

  //ボタンが押されたら
  button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // エディットテキストの文字を取得
      text = editText.getText().toString();
      // 取得したテキストを TextView に張り付ける
      //textView.setText(text);
    }
  });

  //入力された時刻と適合する時刻を探すメソッド
  match(text);


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


追記:

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/23 16:54

    jimbe様

    このコメントを見た瞬間に衝撃が走りました。
    完全に頭の中から抜け去っていたequalsメソッドを記述したことで、動作確認が取れました。

    どこが原因かは推測できるのに、それがなぜダメなのかという理由をしっかり考え、すぐに間違いに気付けるようにならないといけないなと思いました。
    今後もこういうことがたくさん起こると思うので、ちゃんと自力で気づけるようになっていきたいし、そのためにももっとプログラムに触れる機会を増やしていきたいと思います。

    本当にありがとうございました

    キャンセル

  • 2019/05/23 18:01 編集

    equals のことは勿論ご存知だろうとの推測から, 気付いてさえ頂ければと少々意地の悪い回答/コメントが続いてしまってすいません. <(_ _;>
    text と s が(表示上)同じ文字列の時に `text == s` が true になっているかと疑うのは, `1+1=2` を疑うようでなかなか難しいと思います.

    自分の間違いは分かり難いですが, 他人の間違いは案外気付くものです.
    teratail には(自称)初心者の方々のご質問もありますので, 試しに原因を究明してみますと, 「こんなこともある」「あんなこともある」と気付きの種を得られるのではと思います. その種がやがて「そういえばあの時こんな感じだった」と自身の気付きに成長するでしょう.
    偉そうになってしまいますが, (機能追加の手際等)お力はあると思いますので, 今後も是非開発を続けて頂けたらと思います.
    お疲れ様でした.

    キャンセル

  • 2019/05/23 18:32

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • android studio CSVファイルを読み込んでおき、特定の文字が入力されたら対応する文字を出力したい