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

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

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

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

Q&A

解決済

5回答

1431閲覧

String型の変数から母音だけを抜き出してList型の変数に代入したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

2グッド

0クリップ

投稿2020/01/17 11:04

前提・実現したいこと

String型の変数 String resule="ajisai"から母音のa,i,a,iを抜き出してList型listに追加したい。

まず①String型のajisaiをStringのsplitメソッドで分割したのちにString型配列String[]に{a,j,i,s,a,i}として格納し、②その後asListメソッドで新しく作ったList型のコレクションに代入しました。③その次にlistの要素をfor文で取り出し、if文の条件式中でlist.get(i)と"a","i","u","e","o"を比較して条件に合致するとき(あるいはしないとき)に、あらかじめ用意していた別のlistにlist.addで追加(もしくはもとのlistからlist.removeで要素を削除)して母音だけが入ったlistを得ようとしました。
ですが①、②はうまくいくものの③がうまくいかず、listの中身が空になってしまいます。
System.out.printlnで③の段階でうまく動いていないのは特定できたのですが、いろいろ方法を試したものの
独力では解決できかったので非常に基本的なことでつまずいているのかもしれませんがどうかご助力いただければ嬉しいです。

発生している問題・エラーメッセージ

[a, j, i, s, a, i] [a, j, i, s, a, i] a i a i [a, j, i, s, a, i] [a, j, i, s, a, i] []

該当のソースコード

java

1 2import java.util.ArrayList; 3import java.util.Arrays; 4import java.util.Iterator; 5import java.util.List; 6 7public class test2 { 8 9 public static void main(String[]args) { 10 11 String result="ajisai"; 12 henkan(result); 13 14 15 } 16 17 public static List<String> henkan(String result) { 18 19 20 21 String str = result; 22 23 String[] ar = str.split("");//String型から配列に変換 24 25 List<String> list = Arrays.asList(ar);//配列からリストに変換 26 List<String>list1=new ArrayList<String>();//asListのデメリットを回避 27 list1=list; 28 System.out.println(list); 29 System.out.println(list1);; 30 System.out.println(list.get(0)); 31 System.out.println(list.get(2)); 32 System.out.println(list1.get(0)); 33 System.out.println(list1.get(2)); 34 35 36 ArrayList<String> list2 = new ArrayList<>(); 37 38 Iterator<String> iterator = list2.iterator(); 39 while (iterator.hasNext()) { 40 String str1 = iterator.next(); 41 if (str1 != "a"&&str1 != "i"&&str1 != "u"&&str1 != "e"&&str1 != "o") { 42 43 iterator.remove(); 44 System.out.println(list2); 45 } 46 System.out.println(list2); 47 } 48 49 /*for (int i = 0; i < list1.size(); i++) { 50 51 if (list1.get(i) == "a") { 52 53 list2.add(list1.get(i));//リストに要素を追加 54 55 } else if (list1.get(i) == "i") { 56 57 list2.add(list1.get(i));//リストに要素を追加 58 59 } else if (list1.get(i) == "u") { 60 61 list2.add(list1.get(i));//リストに要素を追加 62 63 } else if (list1.get(i) == "e") { 64 list2.add(list1.get(i));//リストに要素を追加 65 66 } else if (list1.get(i) == "o") { 67 list2.add(list1.get(i));//リストに要素を追加 68 69 } 70 71 }*/ 72 73 74 75 /* // b,c,d を削除したいので、この3つの要素を持つCollectionを生成させる 76 List<String> set = new ArrayList<>(); 77 Collections.addAll(set, "b", "c", "d"); 78 79 // list1をlist2に退避する 80 List<String> list2 = new ArrayList<>(list1);*/ 81 82 // 削除前の要素をすべて表示する 83 //System.out.println(list2.get(0)); 84 //System.out.println(list2.get(2)); 85 86 System.out.println(list); 87 System.out.println(list1); 88 System.out.println(list2); 89 90 /*// b,c,dをlist2から削除する 91 list2.removeAll(set); 92 93 // 削除後の要素をすべて表示する 94 System.out.println(list2);*/ 95 return list2; 96 } 97}

試したこと

for文のほかに拡張for文、イテレーターを試してみたり、if文の条件式を変えたり
してみましたが改善しませんでした。

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

開発環境はeclipseで実行環境はjava13です。

ozwk, shiracamus👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/17 12:05

Arrays.asList で取得できるものは java.util.ArrayList ではなく java.util.Arrays.ArrayList という unmodifiedList ですが理解してますか?
guest

回答5

0

Stream。使ってみようか。

java

1import java.util.Arrays; 2import java.util.List; 3import java.util.stream.Collectors; 4 5public class xxStreamSample { 6 public static void main(String[] main) { 7 final String text = "Ajisai"; 8 final List<String> list = 9 Arrays.stream(text.split("")) 10 .filter(it -> "aiueo".contains(it.toLowerCase())) 11 .collect(Collectors.toList()); 12 13 System.out.println( 14 list.stream() 15 .collect(Collectors.joining(", ")) 16 ); 17 // A, i, a, i 18 } 19} 20

投稿2020/01/17 13:04

編集2020/01/17 13:15
shiketa

総合スコア3971

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

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

0

上記のコメントアウトしたfor文中if文の条件式の比較演算子を==からequalsにしたところ以下の
コードで思った通りの動きができました。

java

1 2for (int i = 0; i < list1.size(); i++) { 3 4 if (list1.get(i).equals("a")) { 5 6 list2.add(list1.get(i));//リストに要素を追加 7 8 } else if (list1.get(i).equals("i")) { 9 10 list2.add(list1.get(i));//リストに要素を追加 11 12 } else if (list1.get(i).equals("u")) { 13 14 list2.add(list1.get(i));//リストに要素を追加 15 16 } else if (list1.get(i).equals("e")) { 17 list2.add(list1.get(i));//リストに要素を追加 18 19 } else if (list1.get(i).equals("o")) { 20 list2.add(list1.get(i));//リストに要素を追加 21 22 } 23 24

しかしイテレーターを使って書いた方は!(…equals(""))と書き直しても動きませんでした。

java

1 2 3Iterator<String> iterator = list2.iterator(); 4 while (iterator.hasNext()) { 5 String str1 = iterator.next(); 6 if (!(str1.equals("a"))&&!(str1.equals("i"))&&!(str1.equals("u"))&&!(str1.equals("e"))&&!(str1.equals("o"))){ 7 8 iterator.remove(); 9 System.out.println(list2); 10 } 11 System.out.println(list2);

投稿2020/01/17 11:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

まずlist2をArrayListクラスでnewした直後にiterator変換してますが、
それだとリストに何も要素が入ってないのでループに入ることもなく処理が終わってしまいます。

また要素の入っているlist、list1をiteratorでループさせたとしても、
母音をチェックするif分クラスで複数の条件を&&で繋げています。
&&はAnd条件になるので、これだと一文字が"a"、"i"、"u"、"e"、"o"全てであるというありえない条件になってしまいます。
Or条件になる||を使いましょう。

後、Arrays.asList()メソッドで配列を変換して作ったListクラスは正確にはArrayListではなく、Arrays.ArrayListというArraysクラスの内部クラスでaddやremoveによる要素変更ができない特殊なものなので注意してください。

この場合、list、list1をループさせて、空のlist2クラスにaddで追加して別なリストを作っていくのが無難だと思います。

投稿2020/01/17 11:42

編集2020/01/17 12:11
yureighost

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2020/01/17 12:07

どなたの回答も非常に参考になったのですが、自分の煮詰まっているところを分かりやすく説明してくださったので選ばせていただきました。とくにArrays.asList()メソッドが要素変更できないというのは見落としていたところで非常に助かりました。
yureighost

2020/01/17 12:12

補足ですが、And条件のところは否定条件を繋いでいるので正しかったですね。 これは私が読み間違えていました。 間違った情報が書いてあるとまずいので打ち消しで修正させていただきました。
guest

0

全然違う書き方だけど、参考になれば・・・

java

1import java.util.List; 2import java.util.Arrays; 3 4public class Main { 5 6 public static void main(String[] main) { 7 var text = "Ajisai"; 8 var result = henkan(text); 9 result.forEach(System.out::println); 10 } 11 12 public static List<String> henkan(String text) { 13 return Arrays.asList( 14 Arrays.stream(text.split("")) 15 .filter(s -> "aiueo".contains(s.toLowerCase())) 16 .toArray(String[]::new)); 17 } 18}

実行結果

A i a i

投稿2020/01/17 11:34

編集2020/01/17 23:58
shiracamus

総合スコア5406

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

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

退会済みユーザー

退会済みユーザー

2020/01/17 12:04

まだjavaを学習し始めたばかりでうまくコードをかけないのですが、使いこなせばこんなにスマートに書けるんですね。ソースコードの部分で初めて見るような書き方もあるのでぜひ調べて今後の参考にさせてもらいたいと思います。ありがとうございました。
guest

0

javaでstringを比較するとき== (!=)を使っても思ったような結果にはなりません
equalsを使いましょう

投稿2020/01/17 11:16

ozwk

総合スコア13521

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

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

退会済みユーザー

退会済みユーザー

2020/01/17 12:02

回答ありがとうございます。追記にあるように==をequalsに変更したところ、一部動作が確認できました。 初歩的なところで恥ずかしい限りです。数時間ハマっていたので本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問