🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

899閲覧

java ファイルからのString格納方法

KttShK

総合スコア9

Java

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

0グッド

1クリップ

投稿2019/09/21 16:15

java初心者です。

以下のようなテキストがあったとして、これをコロン手前の人間の名前だけを集めた配列と
コロン後ろの複数の人間を集めた二次元配列に分ける場合、どういった方法が簡単でしょうか?

私は以下のようなアプローチをとったのですが、不要なものが多いような気がしたのでお聞きした次第です。

1)ファイルの中身をScannerで取ってきて行数を確認➡配列の数字に利用
2)Scannerで拾ってきた以下中身を「:」もしくは改行でSplit。これをString配列へ格納 ➡ 行数の二倍の数字ができる。
3)奇数は「:」前までの数字、偶数は「:」後の改行までの文字列が入っているので、奇数分をString配列にて格納
4)偶数分については、新たな配列に行ごとに複数のなまえをまるごと格納。
5)1)で行数がわかっているので、二次元配列の前半にその数字を入れて、4)格納した配列から名前をSplitて文字を入れ込む

テキストの中身は以下
Kate: Chris, Joe, Anna, Frank , Nancy
Chris: Kate, Nancy, Peter, Steve, Frank, Tim, Amy
Charles: Sara, Kevin, Peter, Steve
David: Steve, Amy , Bob
Frank: Anna, Kate, Mary , Pop
Max: Kate , Nancy , Tim
Smith: Kevin, Kate, Tim, Bob

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

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

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

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

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

BluOxy

2019/09/21 16:36 編集

そのテキストは何のために配列へ保持するのでしょうか。 どのような形式で配列に保持すればそのプログラムの要件を満たすのでしょうか。
KttShK

2019/09/21 16:36

最終的にはコロン前の名前だけを集めた配列と、コロン以降の名前を入れた二次元配列をぶつけてSerachする目的です。例えばKate以降の5名はKateの友達リストです。 コロン以降の名前の集まりはコロン前の名前の人の友達リストです。 KateとChris(前者の配列の[0],[1])を比較して後者の二次元配列の中から共通する友人、ここでいえばFrankとNancyを探し当てるようなものを作りたいです。
BluOxy

2019/09/21 17:08 編集

1~5の日本語による説明では動作をイメージするのに限界がありますので、実際のコードを掲示して頂けますか。何をどうするべきかはそのコードをベースに説明できるとより具体的な回答が書けそうです。
KttShK

2019/09/21 17:11

以下のように記載しました。 ぐちゃぐちゃな文で恐縮です。 String[] strBox = listA.toString().split(":|\n");  //こちらで分割 2)に該当 mainPerson = new String[7]; for (int i = 0; i < strBox.length/2; i++) { mainPerson[i] = strBox[i*2]; // 名前格納 } String[] tempName = new String[strBox.length/2]; お友達を格納 for (int i = 1; i <= strBox.length/2; i++) { tempName[i-1] = strBox[(i*2)-1].toString().replace(" ", ""); } yujin = new String[7][]; for (int i = 0; i < 7; i++) { yujin[i] = tempName[i].trim().split(","); }
swordone

2019/09/21 17:43

質問を編集してコードを記載してください。
guest

回答2

0

ベストアンサー

追記修正コメント内のコードを見る限り、行数は決まっているのでしょうか?
だとすれば、あらかじめ配列を人数分作っておき、行ごとに読み込んで順次入れていくという手法が一般的ではないでしょうか。

java

1Scanner s = new Scanner(file); // よくわからんので適当 2String[] names = new String[7]; 3String[][] friends = new String[7][] 4for(int i = 0; i < 7; i++) { 5 String[] temp = s.nextLine().split(":"); 6 names[i] = temp[0]; 7 friends[i] = temp[1].split(","); 8}

投稿2019/09/21 20:10

swordone

総合スコア20669

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

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

KttShK

2019/09/21 20:25

ありがとうございます。二次配列の値導入のイメージが分かっておらず、お聞きした次第です。 行数は決まってはいません。質問内容を明確にするために追加修正の中にはあえて数字を固定して入れております。本来は数字は確定しておらず、ファイル内の情報が増えた分、柔軟にとりこめるようにしなければいけません。ここについてはファイルの中の行数を行数チェックでカウントして数字を取りました。
swordone

2019/09/22 01:47

行数チェックって何するんだ?と思いましたが、行数が分かるならどちらでもいいです。
guest

0

回答

どういった方法が簡単でしょうか?
私は以下のようなアプローチをとったのですが、不要なものが多いような気がした

そのコードが「なぜ不要なものが多い」と感じたかを考えることが大事です。

個人的には不要なものがあるかどうかよりもコードが読みにくいことが気になります。
特に変数の命名やデータの保持方法辺りが気になります。

まずはそういった点を改善し、読みやすいコードを作ると良いでしょう。
ロジック的に不要なものがあるかどうかはその後に判断してはいかがでしょうか。

では、どのようにして読みやすいコードにするか。
改善策を下記に記載します。

改善案

人間の名前と友達一覧を持つクラスを定義して、そのリストを生成して読み込んだデータの管理をするのが良いでしょう。
使うのは配列ではなくリストです。配列よりもリストの方が要素数が不定のときの取り回しが効きます。

また、mainPersonyujinのように別々の変数で管理するのではなくオブジェクトで両方とも保持しておく方が人に理解しやすいコードを書けます。

例えば下記のようなUserクラスを定義します。

java

1public class User{ 2 private String name; 3 private List<String> friends; 4 5 public User(String name, List<String> friends){ 6 this.name = name; 7 this.friends = friends; 8 } 9}

プログラム上で下記のように読み取ります。

java

1import java.util.*; 2import java.lang.*; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 List<User> users = new ArrayList<User>(); 7 8 //input 9 String listA = "Kate: Chris, Joe, Anna, Frank , Nancy\nChris: Kate, Nancy, Peter, Steve, Frank, Tim, Amy\nCharles: Sara, Kevin, Peter, Steve\nDavid: Steve, Amy , Bob \nFrank: Anna, Kate, Mary , Pop\nMax: Kate , Nancy , Tim\nSmith: Kevin, Kate, Tim, Bob"; 10 String[] rows = listA.toString().split("\n"); 11 for(String row : rows){ 12 String[] columns = row.split(":"); 13 List<String> friends = Arrays.asList(columns[1].split(",")); 14 String name = columns[0]; 15 User user = new User(name,friends); 16 users.add(user); 17 } 18 19 //output 20 for(User user: users){ 21 System.out.println( 22 String.format( 23 "username:%-8s, friends:[%s]", 24 user.getName(), 25 String.join(",",user.getFriends()) 26 ) 27 ); 28 } 29 } 30}

出力結果

username:Kate , friends:[ Chris, Joe, Anna, Frank , Nancy] username:Chris , friends:[ Kate, Nancy, Peter, Steve, Frank, Tim, Amy] username:Charles , friends:[ Sara, Kevin, Peter, Steve] username:David , friends:[ Steve, Amy , Bob ] username:Frank , friends:[ Anna, Kate, Mary , Pop] username:Max , friends:[ Kate , Nancy , Tim] username:Smith , friends:[ Kevin, Kate, Tim, Bob]

改めて書きますが、修正したポイントは3つです。

  • 変数の命名を意味が分かるものにする
  • 読み込んだ文字列をオブジェクトとして管理する
  • 要素数が不明なときはListを使うと取り回しが効きやすい

投稿2019/09/21 17:38

編集2019/09/21 18:09
BluOxy

総合スコア2663

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

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

KttShK

2019/09/21 19:56

どうもありがとうございます。命名等、わかりやすく作るように心がけます。 Listはまだ習っておらず、今回は二次元配列と配列のみでどうシンプルに作り上げるのか気になっておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問