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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

1680閲覧

ArrayListに格納した特定文字列の判定をし、それが何番目にあるかを出力したい。

bozoview

総合スコア1

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

2クリップ

投稿2021/09/09 06:39

編集2021/09/09 08:04

前提・実現したいこと

Java初心者です。文字列を判定しつつカウント、文字の表記も合わせる為のヒントが欲しいです。
テキストファイルtext1.txtを呼び、ArrayListに格納しています。
テキストファイルの文字コードUTF-8に合わせて、本テーマにしている文字列の位置を表示させる。
必要であろう文字列の判定を行いたい。その際、何番目の文字列として特定の文字列があるかを出力する。

下記に理想とする答えの形を掲示する。
<理想の結果 / UTF-8 形式 >

かき
さしす
たちつて
なにぬねの
なにぬねの
たちつて
さしす
かき

3番目

発生している問題

他の出力した文字列と同じような文字コードによる表記にならない事。
カウントさせるかして特定文字列が何行目にあるか探りたいが構文が思いつかない。

該当のソースコード

判定するためのコードだけ記述しておりません。

Main

1import java.io.BufferedReader; 2import java.io.FileInputStream; 3import java.io.IOException; 4import java.io.InputStreamReader; 5import java.util.ArrayList; 6 7public class Main { 8 9 public static void main(String[] args) { 10 11 String data; 12 13 try { 14 15 ArrayList <String> list = new ArrayList<String>(); 16 17 FileInputStream fi = new FileInputStream(args[0]); 18 19 20 InputStreamReader in = new InputStreamReader(fi,"UTF-8"); 21 22 BufferedReader fw = new BufferedReader(in); 23 24 while((data = fw.readLine()) != null) { 25 26 list.add(data); 27 28 } 29 30 for(String m:list) { 31 32 System.out.print(m+"\n"); 33 34 } 35 for(int i=list.size()-1;i>=0;i--) { 36 37 System.out.print(list.get(i)+"\n"); 38 39 } 40 41 fw.close(); 42 43 } catch(IOException e) { 44 45 System.out.print("IOEエラー"); 46 47 }finally { 48 49 } 50 51 } 52 53}

text1

12かき 3さしす 4たちつて 5なにぬねの

試したこと

int c=0; if(!(list.equals("さしす"))){ c++; }

List格納時に否定から入るIF文を使用し、特定文字列以外の時にカウントさせて幾つ目の文字列か見つける。
しかし、特定文字列でカウントを辞めさせる構文が思いつかず結局5回カウントさせてしまう。

int n = 0; n = list.indexOf("さしす");

上記のコードを使用する方法も考えたが、何文字先に特定文字列があるかでなく、幾つ目の文字列にあるか探りたいので扱いが分からずにいる。

補足情報(FW/ツールのバージョンなど)

Eclipseを使用

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

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

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

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

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

maisumakun

2021/09/09 06:49

> 他に上記のコードを加えてみようにも、文字列毎に分けて行う前も後も使いどころがないように見える。 どういう意味でしょうか?
jimbe

2021/09/09 06:55

> 文字列を判定しつつカウント、文字の表記も合わせる ”カウント”や"表示を合わせる"とは、何のことを仰っているのでしょうか。 得たい結果に対してご自身で考えられた方法(「(何かを)カウントするはずだ」等)からくる表現としますと、その方法をご説明頂かないといけませんが。 > 他の出力した文字列と同じような文字コードによる表記にならない "他の出力した文字列"とは何でしょう。"同じような文字コードによる表記"とは、UTF8 なのに UTF16 だったとか SJIS だったとかしているのでしょうか。 > List格納時に否定から入るIF文を使用し、~ これは言葉では無くコードでお示し頂いたほうが分かり易いかと思います。
dodox86

2021/09/09 07:36

何と言いますか、望む結果になるようにコードをあれこれとこねくり回すのではなく、考え(設計)をもって、それを表現するようにコードを書かなければならないのですが。まず頭と手とペンでそれができるか、です。
bozoview

2021/09/09 07:44

>どういう意味でしょうか? 実際に動かせていなかったのでl、indexOfメソッドを使うと特定文字列までの位置。 今回であれば、『あかきさしすたちつてなにぬねの』の前の方から3つ目となっていますが求めたいのは {文字列の数で3つ目} なんですね。 私のイメージでは、readlineメソッド使った際に使用してみた場合、-1か0になってしまうと思ってそう記述しました。 カウントしたらいいのかよく分からなくて質問しました。 返答になってなかったらすみません。
bozoview

2021/09/09 07:52

必要な知識、不足している知識を補う発想、要点を抑えて理解する能力、人に伝える事の出来る語彙力、他にもいろいろありますが、ロジカルに考えられるようにしたいですね(願望)
Luice

2021/09/09 08:00

list準拠で行くと {"あ", "かき", "さしす"} で3番めだし、 文字数準拠で行くと "あかきさしす..."で4番めな気がしますが 「文字列の数で3つ目」の定義ってどういうことなんでしょうか?
bozoview

2021/09/09 08:09

該当文字列はテキストファイルの3行目に位置するものなので、考え方としてはLIst準拠で導き出した方が良いんですかね。全体的に日本語がおかしくて申し訳ない。
Crimson_Tide

2021/09/09 09:09

ArrayListのindexOf()メソッドとStringのindexOf()メソッドを混同されていませんか? https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#indexOf-java.lang.Object- https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#indexOf-java.lang.String-int- bozoviewさんはStringのindexOf()しか頭にないように見受けられます(勘違いでしたらすみません)。 Luiceさんの回答もjimbeさんの回答もArrayListのindexOf()メソッドを使う前提で回答されていると思います。 (1) 前提として「特定したい文字列」は「いずれかの行にあり、その行にはその文字列しかない」であっていますか? 例えば「特定したい文字列:さしす」 として 「さしす」とだけ書かれた行だけに一致すればいいのか、 「あさしすせそ」という行も合致していると判断させたいのか どちらでしょう? 質問内容だけ見ると前者だけと判断してしまうかと思います。 後者だとするとやや別のアプローチが必要になります。 (2) (1)の回答が前者だとして 要求は「特定文字列がテキストファイルの何行目にあるかを知りたい」であっていますか? であるならば、 変数listはStringのArrayListで行毎にテキストファイルの文字列が代入されています。 list.indexOf("文字列")で文字列と完全一致する要素があるインデックスを返すので結果的に (該当文字列の行数-1)が得られます。 そのためLuiceさんの回答もjimbeさんの回答も要求に沿うものだと思いますが、 何か前提が違うでのでしょうか?
bozoview

2021/09/09 09:43

(1)文字列の判定は完全一致であってます。 (2) >特定文字列がテキストファイルでいう何行目にあるかを知りたい 仰る通りです。 >何か前提が違うでのでしょうか? 3番目(3行目)になる予定で見ているのですが、jimbeさんが提示してくださった形を使わせていただいた結果が3ではなく0でした。
bozoview

2021/09/09 09:48

追記, 文字列はスペース?が1つ入ったような結果で、 〇番目だけはスペースのない完全左詰めなので、 そこもどうにか文字列達と先頭文字の高さを合わせたいです。
jimbe

2021/09/09 09:50 編集

> 文字列はスペース?が1つ入ったような結果 それは重要な情報です。 ご提示頂いている text1 にはスペース?は無いようです。
BeatStar

2021/09/09 11:46

> 実際に動かせていなかったので そういう場合は Paiza IO ( https://paiza.io/ja/projects/new ) とかで試してみてください。 環境設定や「フォルダを生成する」とかの場合はできないかもしれませんが、今回のようなものだと試せるはずです。
guest

回答2

0

ベストアンサー

恐らく、fw.close() の直前か直後辺りに

java

1System.out.println((list.indexOf("さしす")+1)+"番目");

と入れるだけではないでしょうか。


コードの空行を消して、二か所に処理を追加しています。

  1. ".trim()" 追加

スペースらしきモノが付いてるようなので、それを(本当にスペースなら)削除します。
2. 行追加
"さしす"の行番号を表示します。

java

1import java.io.*; 2import java.util.ArrayList; 3 4public class Main { 5 public static void main(String[] args) { 6 String data; 7 try { 8 ArrayList <String> list = new ArrayList<String>(); 9 FileInputStream fi = new FileInputStream(args[0]); 10 InputStreamReader in = new InputStreamReader(fi,"UTF-8"); 11 BufferedReader fw = new BufferedReader(in); 12 while((data = fw.readLine()) != null) { 13 list.add(data.trim()); //".trim()" 追加 14 } 15 for(String m:list) { 16 System.out.print(m+"\n"); 17 } 18 for(int i=list.size()-1;i>=0;i--) { 19 System.out.print(list.get(i)+"\n"); 20 } 21 22 System.out.println((list.indexOf("さしす")+1)+"番目"); //行追加 23 24 fw.close(); 25 } catch(IOException e) { 26 System.out.print("IOEエラー"); 27 }finally { 28 } 29 } 30}

plain

12かき 3さしす 4たちつて 5なにぬねの 6なにぬねの 7たちつて 8さしす 9かき 10113番目

投稿2021/09/09 07:01

編集2021/09/09 11:10
jimbe

総合スコア12648

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

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

bozoview

2021/09/09 09:42 編集

訂正、+1が抜けてました。 それをすると0と表示されました。
jimbe

2021/09/09 09:40

text1 を指定して実行しますと あ かき さしす たちつて なにぬねの なにぬねの たちつて さしす かき あ 3番目 と表示されるのですが…。 また、文字列が見つからなかったなら(+1していますから) "0番目" と表示されるはずです。 どのような行をどこに追加されたのでしょうか。
dodox86

2021/09/09 09:48

jimbeさんの回答にある含みを理解されていないのだと思います。 単純に、1行目に対して回答のコードを実行すると-1が返るので、それに対して+1して0を出力しただけでは。
jimbe

2021/09/09 11:04

コード全体を出した方が良さそうですね^^;
bozoview

2021/09/10 00:30

皆様ありがとうございました。少しずつ勉強頑張ってみます。 結局、答えを提示して貰ってしまうまで手間取らせてしまい申し訳ありません。
guest

0

Listをfor文でループさせて、該当する文字列にhitしたindex+1番めじゃ駄目なんですか?

投稿2021/09/09 06:52

Luice

総合スコア771

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

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

bozoview

2021/09/09 07:46

文字列までの文字数がたまたま3文字であるだけで、文字列として3つ目を導きたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問