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

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

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

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

Q&A

解決済

1回答

1849閲覧

read files with readAllLines and usage of reverse method

MilagrosS

総合スコア7

Java

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

0グッド

0クリップ

投稿2020/04/27 09:38

編集2020/04/28 03:31

前提・実現したいこと

<前提>
コンソールから Text1.txt Text2.txt Text3.txtとして
プログラムを起動すると、まずtext3.txtが出力され、次にtext2.txtが出力されるようにしたい。
実行引数
メソッド作成
以下を使用できたらなおよい。
List<String> allLines = Files.readAllLines(Paths.get("fileName"));
allLines.forEach(System.out::Println);
<実現させたこと>
ファイルを逆順に出力

<わからないこと>
メソッドを作成して、
ラムダだが、メソッド参照を使用して逆順ファイルを出力

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

for(String l : lists) {//ここでおこられる
System.out.println(get(l));
にすると以下のようにerrorが発生します。
エラーメッセージ
型の不一致: 要素タイプ List<String> から String には変換できません

該当のソースコード

Java

1import java.io.IOException; 2import java.nio.file.Files; 3import java.nio.file.Paths; 4import java.util.Collections; 5import java.util.LinkedList; 6import java.util.List; 7 8 9 10public class Demo8 { 11 12 13 public static void main(String[] args) { 14 try { 15 List<String> list = Files.readAllLines(Paths.get(args[0])); 16 List<String> list1 = Files.readAllLines(Paths.get(args[1])); 17 List<String> list2 =Files.readAllLines(Paths.get(args[2])); 18 19 LinkedList<List <String>> lists = new LinkedList<List <String>>(); 20 lists.add(list); 21 lists.add(list1); 22 lists.add(list2); 23 Collections.reverse(lists);//要素を逆順にする 24 25 for (String l : lists) { 26 System.out.println(get(l); 27 //for (String l : lists.get(0)) { 28 System.out.println(l); 29 } 30 31 32 } catch (IOException e) { 33 34 e.printStackTrace(); 35 } 36 37 } 38}

試したこと

まず、逆順にソートさせてText3のファイルの中身が全行読み込まれて出力出来るかどうか。

Java

1 2public static void main(String[] args) { 3 try { 4 List<String> list = Files.readAllLines(Paths.get(args[0])); 5 List<String> list1 = Files.readAllLines(Paths.get(args[1])); 6 List<String> list2 =Files.readAllLines(Paths.get(args[2])); 7 8 LinkedList<List <String>> lists = new LinkedList<List <String>>(); 9 lists.add(list); 10 lists.add(list1); 11 lists.add(list2); 12 Collections.reverse(lists);//要素を逆順にする 13 for (String l : lists.get(0)) { 14 System.out.println(l); 15 }

以下のサイトを参照して学習してみた
ラムダだが、メソッド参照
Class Files
Rreverse method
###追記
降順で出力できたけど、結果が"[]"になった状態で出力されてしまった。
どうしたら解決しますでしょうか?

Java

1 2 LinkedList<List <String>> lists = new LinkedList<List <String>>(); 3 lists.add(list); 4 lists.add(list1); 5 lists.add(list2); 6 Collections.reverse(lists);//要素を逆順にする 7 for (int i = lists.size() - 1; i >= 0; i--) { 8 System.out.println(lists.get(i)); 9 } 10 } catch (IOException e) { 11 12 e.printStackTrace(); 13 } 14 15 } 16} 17

###The result is as bellow
出力結果

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

Java version 8.0
使用しているeditor:Eclipse

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

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

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

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

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

dodox86

2020/04/27 10:01

> コンソールから Text1.txt Text2.txt Text3.txtとして ファイル名でのソートでしょうか。コンソールから「Text3.txt Text1.txt Text2.txt」と指定されたらどう動きますか。 ファイル名での逆順ソートなら「Text3.txt Text2.txt Text1.txt」の順ですが、 コンソールでのコマンドライン引数の並びの逆順ソートなら、「Text2.txt Tex1.txt Text3.txt」の順になります。
MilagrosS

2020/04/27 11:38

コマンドライン引数の並びでソートかけているから問題なんですね つまりファイル名でソートかければいいのですね。
dodox86

2020/04/27 12:07

いえ、そうではなくMilagrosSさんがどちらの方法をしたいのか、ということです。
dodox86

2020/04/27 12:10

ファイル名でソートする方が簡単ですが、質問のエラーはそれとは別の問題です。
MilagrosS

2020/04/28 02:30

質問の意図を理解出来てなくて申し訳ございません。 ファイル名でソートしたいです。
guest

回答1

0

ベストアンサー

「コマンドライン引数の並び順に関係なく、ファイル名を降順でソートし、その順番でファイルの内容を出力したい」と言うのがご要望だとします。

降順で出力できたけど、結果が"[]"になった状態で出力されてしまった。

本当に、降順で出力できていますか? Collections.reverse(lists)でせっかく降順にしたのに、for (int i = lists.size() - 1; i >= 0; i--) {のループで
昇順(後ろから)で要素を取り出しています。更に、結果が[]で出力されるのは、LinkedListtoString()メソッドが暗黙的に使われているためです。

Java

1Collections.reverse(lists);//要素を降順にする 2for (int i = lists.size() - 1; i >= 0; i--) { 3 System.out.println(lists.get(i)); 4}

質問者さんのコードの延長で修正するならば、以下のようになります。

Java

1 2import java.util.*; 3import java.nio.file.*; 4import java.io.*; 5 6public class t1 { 7 public static void main(String[] args) { 8 try { 9 List<String> list = Files.readAllLines(Paths.get(args[0])); 10 List<String> list1 = Files.readAllLines(Paths.get(args[1])); 11 List<String> list2 =Files.readAllLines(Paths.get(args[2])); 12 13 LinkedList<List <String>> lists = new LinkedList<List <String>>(); 14 lists.add(list); 15 lists.add(list1); 16 lists.add(list2); 17 Collections.reverse(lists);//要素を降順にする 18 19//!NG せっかく降順にしたリストから、昇順に取り出している 20// for (int i = lists.size() - 1; i >= 0; i--) { 21 for (int i = 0; i < lists.size(); i++) { 22 // System.out.println(lists.get(i)); 23 List<String> nlist = lists.get(i); 24 for (int j = 0; j < nlist.size(); j++) { 25 System.out.println(nlist.get(j)); 26 } 27 } 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 } 32}

Windows 10 のWSL/Ubuntu上で動かします。text1.txttext3.txtのファイルの内容がそれぞれ以下のようなものだとして、

sh

1$ cat text1.txt 2text1.txt - LINE1 3text1.txt - LINE2 4text1.txt - LINE3 5text1.txt - LINE4 6 7$ cat text2.txt 8text2.txt - LINE1 9text2.txt - LINE2 10text2.txt - LINE3 11text2.txt - LINE4 12 13$ cat text3.txt 14text3.txt - LINE1 15text3.txt - LINE2 16text3.txt - LINE3 17text3.txt - LINE4

それで実行すると、以下のように正しく出力されます。

sh

1$ java t1 text1.txt text2.txt text3.txt 2text3.txt - LINE1 3text3.txt - LINE2 4text3.txt - LINE3 5text3.txt - LINE4 6text2.txt - LINE1 7text2.txt - LINE2 8text2.txt - LINE3 9text2.txt - LINE4 10text1.txt - LINE1 11text1.txt - LINE2 12text1.txt - LINE3 13text1.txt - LINE4

上記のコードで動作はしますが、本来LinkedListである必要もないし、3つのファイルを最初から全部読み出しておく必要も無いと思います。それで書き直してみたのが以下のコードです。同じ結果になりますので試してみてください。コマンドライン引数で指定するファイルも3つ固定ではなく、指定した分だけ処理できます。

Java

1import java.util.*; 2import java.nio.file.*; 3import java.io.*; 4 5public class t2 { 6 public static void main(String[] args) { 7 // コマンドライン引数をリストにして、降順ソート 8 List<String> argList = Arrays.asList(args); 9 Collections.reverse(argList); 10 11 // 降順にしたファイル名をひとつづつ処理 12 for (String fileName : argList) { 13 try { 14 // ファイルから全行を読み出し 15 List<String> lineList = Files.readAllLines(Paths.get(fileName)); 16 17 // 1行づつ出力 18 for (int i = 0; i < lineList.size(); i++) { 19 System.out.println(lineList.get(i)); 20 } 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25 } 26} 27

投稿2020/04/28 07:19

dodox86

総合スコア9183

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

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

MilagrosS

2020/04/28 08:49

すみません。確認したところ、ご回答者様のおっしゃる通り、昇順(後ろから)で要素を取り出していました。 また、「結果が[]で出力されるのは、LinkedListのtoString()メソッドが暗黙的に使われているため」ということは勉強不足で知らなかったのでとても勉強になりました。
dodox86

2020/04/28 09:19

> 「結果が[]で出力されるのは、LinkedListのtoString()メソッドが暗黙的に使われているため」ということは勉強不足で知らなかったので はい。JavaのすべてのクラスのルートとなるObjectクラスはtoString()メソッドを持っていて、継承したクラスは必要に応じてオーバーロードしています。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#toString-- ※心配になったのでLinkedListについて一応確認しました。以下のサンプルコードをご覧ください。 ---- import java.util.*; public class t1b { public static void main(String[] args) { List<String> list = Arrays.asList("item1", "item2", "item3"); LinkedList<List<String>> lists = new LinkedList<List<String>>(); lists.add(list); System.out.println(lists.get(0)); System.out.println(lists.get(0).toString()); } } ---- これは、こう出力されます。toString()の出力内容と同じです。 $ java t1b [item1, item2, item3] [item1, item2, item3]
MilagrosS

2020/04/29 12:54

ご親切にご回答とサンプルのご教示ありがとうございます。 これからの学習の際に参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問