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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

4回答

636閲覧

ファイルから読み込んだカタカナ文字を重複なく表示したいです

-_sora.

総合スコア12

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/07/03 03:30

編集2020/07/03 05:58

前提・実現したいこと

javaで複数行からなるtextファイルを読み込み,カタカナ語(1文字目はァ~ヶでなる文字,二文字目以降は'ー'も考慮)を読みだして,登場するカタカナ語を重複なく表示したいです.

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

実行はできましたが,重複が検出されず,そのままカタカナ文字がすべて表示されてしまいました.

該当のソースコード

while ((line = br.readLine()) != null){/* 行単位で処理 */ int len = line.length(); if (len <= 0) continue; int i=0; while (i < len){ char x = line.charAt(i); /* 1文字目がカタカナ語か否かを判定 */ if (x >='ァ' && x <= 'ヶ') { word[key]+=x; i++; x = line.charAt(i); /* 二文字目以降がカタカナ語もしくは'ー'か否かを判定 */ while(x >='ァ' && x <= 'ヶ'||x=='ー') { word[key]+=x; i++; x = line.charAt(i); } /* カタカナ文字の重複があるかを確認 */ for(int a=0;a<100;a++) { if(word[key].equals(word[a])) { dup=1; System.out.println("true"); if(key==a) { dup=0; } } } System.out.println(dup); if(dup!=1) { System.out.println(word[key]); } key++; } i++; dup=0; } }

試したこと

if (x >='ァ' && x <= 'ヶ') の最初にword[key]を表示するように組んだところ,各カタカナ文字の1文字目が表示され,while(x >='ァ' && x <= 'ヶ'||x=='ー')でword[key]を表示したところ,カタカナ文字の二文字目以降が表示されたのでword[key]の値は問題なく入っていると思います.
for(int a=0;a<100;a++) でword[a]の値も表示させたが問題なくすべて正常なカタカナ語が表示されました.
if(word[key].equals(word[a]))の最後でdupの値を表示させたところ,すべて0となってしまったので,if(key==a) dup=0; が毎回実行されているのだと思われます.

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

eclipseを使用.文字コードはUTF-8.

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

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

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

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

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

guest

回答4

0

文字を一旦全てjava.util.HashSetに格納し、重複を除去した後、表示するというのはいかがでしょうか。

※java.util.HashSetは重複した値は保持しないという機能があります。

投稿2020/07/03 03:55

perorin0418

総合スコア90

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

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

0

ベストアンサー

いろいろ突っ込みたいところはあるけど、何も出ない状態から結果を表示するだけなら、

Java

1key++; 2if(dup!=1) { 3 System.out.println(word[key]); //重複していない場合のみ文字列を表示 4}*/

のインクリメントとif文の順番を入れ替える。あるいは、word[key - 1]を表示すればいい。ついでに「*/」を取る(なぜここに)。keyをインクリメントしてからword[key]を表示したら、そりゃ何も表示されないだろう。

重複確認は、word[0]word[key - 1]までの内容とword[key]の内容を比較すればいいので、

Java

1/* カタカナ文字の重複があるかを確認 */ 2for(int a = 0; a < key; a++) { 3 if(word[key].equals(word[a])) { 4 dup = 1; 5 break; 6 } 7}

とすればいい。これなら、keyとaが等しくなることはないので、i文はいらない。また、dupがいったん1になったなら、残りの要素と比較する必要はないのですぐにbreakすればいい。

投稿2020/07/03 05:10

編集2020/07/03 07:32
Daregada

総合スコア11990

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

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

-_sora.

2020/07/03 06:06

申し訳ありません.*/があったのはプログラムをコピーする際のミスです.修正しました. 結果,カタカナ文字がすべて重複したまま表示されてしまいました.上記の質問文自体も編集しましたが,よければ回答をいただけると嬉しいです.
-_sora.

2020/07/03 10:42

無事重複なくカタカナ語を表示することができました.ありがとうございます!
guest

0

正規表現とHashSetで処理するやつ。

Java

1import java.util.regex.Pattern; 2import java.util.regex.Matcher; 3import java.util.HashSet; 4import java.nio.charset.Charset; 5import java.nio.file.Files; 6import java.nio.file.Path; 7import java.nio.file.Paths; 8import java.io.IOException; 9 10class Sample1 11{ 12 public static void main(String[] args) 13 { 14 var word_list = new HashSet<String>(); 15 String regex = "([ァ-ヶ][ァ-ヶー]*)"; 16 Pattern pattern = Pattern.compile(regex); 17 18 try { 19 for (var filename : args) { 20 String text = Files.readString(Paths.get(filename)); 21 22 Matcher m = pattern.matcher(text); 23 if (m.find()) { 24 do { 25 word_list.add(m.group()); 26 } while (m.find()); 27 } 28 } 29 } catch (IOException e) { 30 System.out.println(e); 31 } 32 33 for (var word : word_list) { 34 System.out.println(word); 35 } 36 } 37}

投稿2020/07/03 06:47

編集2020/07/03 07:22
Daregada

総合スコア11990

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

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

0

ArrayList を使ってみました。

Java

1import java.io.*; 2import java.util.ArrayList; 3 4class Test { 5 public static void main(String[] args) throws IOException { 6 7 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 8 9 ArrayList<String> word = new ArrayList<>(); 10 String line; 11 12 while ((line = br.readLine()) != null) { // 行単位で処理 13 int len = line.length(); 14 if (len <= 0) continue; 15 if (line.charAt(0) == '_') continue; 16 int i = 0; 17 while (i < len) { 18 char c = line.charAt(i); 19 if ((c < 'a' || c > 'z') && c != '_') break; 20 i++; 21 } 22 if (i < len) continue; 23 if (!word.contains(line)) word.add(line); 24 } 25 System.out.println(); 26 for (String s : word) System.out.println(s); 27 } 28}

追記
while の中で i++ の位置を間違っていたので修正しました。

投稿2020/07/03 05:53

編集2020/07/03 06:30
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問