teratail header banner
teratail header banner
質問するログイン新規登録
Java

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

2回答

1835閲覧

Java ディレクトリ内のソートに関して

moyashimon

総合スコア0

Java

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2021/08/20 00:50

0

0

前提・実現したいこと

Java1を用いて
指定したディレクトリ内にあるファイル名とディレクトリを拡張子の有無でソートしたいです。

【質問詳細】
Javaでファイルとディレクトリ名をソートした上で表示されるような
ものを作っております。
具体的にはlistFileメソッドを用いて指定ディレクトリ内のファイル・ディレクトリ名を取得し、
それをファイルとディレクトリのどちらかが優先的にソートされて出力されるよるようなものになります。
(出力時に分けたい)
現在、ソートに関する処理で躓いており、ArraysortまたはColletionsort内にComparatorクラスを生成する形でソート条件を記述する形での実装を試みております。

Collections.sort(List, new Comparator<String>());
のようなイメージです。

ですが、Comparatorクラスの実装とCollection.sort()内の記述に整合性が取れない状況です。ですので該当部分の実装方法に付き、教えて頂けると幸いです。

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

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

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

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

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

maisumakun

2021/08/20 01:00

> Comparatorクラスの実装とCollection.sort()内の記述に整合性が取れない状況です。 具体的に、「どのようなコードを書いて」、「どう動かしたいものが実際にはどうなっている状況」でしょうか?
jimbe

2021/08/20 02:29

> Comparator<String> Comparator<File> のほうが良さそうに思いますが。
coco_bauer

2021/08/20 03:13

拡張子の有るファイルと、拡張子の無いファイル及びディレクトリ、に分けて出力するという事でしょうか。 拡張子の無いファイルと、同名のディレクトリが存在した場合、判りにくくないですか?
dodox86

2021/08/20 04:02

名前(PATH)名でソートするにあたって、ディレクトリとファイルのPATH名それぞれにあらかじめ重み付けをすれば自然とディレクトリとファイルで分かれそうに思いますが、今あるコードを示さないと、回答しづらいと思いますよ。丸投げは無し、です。
kazuma-s

2021/08/20 05:47 編集

例えば、dir2 というディレクトリの中に、 tmp、tmp.old という 2つのディレクトリと Main.java、Main.class、file3 という 3つのファイルがあった場合、 どういう結果になることを期待するのかを示してください。
TetsujiMiwa

2021/08/21 04:30

質問通りに実装してみたんですが、整合性が取れないという状況がつかめなかったです。実装内容回答欄に記載しましたので、どのあたりで整合性が取れてないか、もう少し詳しくご説明いただけないでしょうか?
guest

回答2

0

↓こんな感じ

Java

1import java.io.File; 2import java.util.ArrayList; 3import java.util.Collections; 4import java.util.Comparator; 5import java.util.List; 6 7public class Class1 { 8 9 // ディレクトリを指定してください。 10 private static final String PATH = "[ディレクトリ書き入れて]"; 11 12 public static void main(String[] args) { 13 14 List<String> list = new ArrayList<String>(); 15 16 // 指定ディレクトリ内のファイルとディレクトリから名前のみ抽出しコレクション化 17 for (File f: new File(PATH).listFiles()){ 18 list.add(f.getName()); 19 } 20 21 // 第一:ファイル→フォルダ順 第2:辞書順 22 Comparator<String> sortF2D = new Comparator<String>() { 23 @Override 24 public int compare(String str1, String str2) { 25 26 boolean isFile1 = isFile(str1); 27 boolean isFile2 = isFile(str2); 28 29 if (isFile1 && !isFile2) { 30 return -1; 31 } 32 33 return str1.compareTo(str2); 34 } 35 }; 36 37 Collections.sort(list, sortF2D); 38 39 for(String fileName : list) { 40 System.out.println(fileName); 41 } 42 } 43 44 private static boolean isFile(String str) { 45 return str.indexOf(".") != -1; 46 } 47}

↓実行結果

.eclipseproduct artifacts.xml eclipse.exe eclipse.exe -clean.cmd eclipse.ini eclipsec.exe lombok.jar configuration dropins features jre p2 plugins readme

投稿2021/08/21 04:28

TetsujiMiwa

総合スコア1124

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

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

0

Comparator#comparing(<Key Extractor>)

ソート項目をcomparingで指定します。最も簡潔なメソッド参照を使います。項目がbooleanの場合、false,trueの順に並びます。

Java

1var directoryLast = Comparator.comparing(File::isDirectory); 2var extensionOrder = Comparator.comparing(q355216::getFileExtension); 3var nameOrder = Comparator.comparing(File::getName); 4var extensionLast = Comparator.comparing(q355216::hasExtension);

メソッド参照のq355216::getFileExtension,q355216::hasExtensionは自分で定義したメソッドです。

Java

1static boolean hasExtension(File f) { 2 return f.isFile() && f.getName().lastIndexOf(".") > 0; 3} 4 5static String getFileExtension(File f) { 6 return f.isFile() ? getExtension(f.getName()) : ""; 7 } 8 9static String getExtension(String name) { 10 int pos = name.lastIndexOf("."); 11 return (pos <= 0) ? "" : name.substring(pos+1); 12}

Comparator#thenComparingを使用する合成

上で作成した単一のComparatorをthenComparingで優先度順に合成します。

Java

1// 合成 2var actualOrder = directoryLast.thenComparing(extensionOrder).thenComparing(nameOrder);

いったん、ここまでをヒントとして示します。

投稿2021/08/20 11:34

xebme

総合スコア1109

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

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

xebme

2021/08/20 11:36

Scalaの複数キーソートに回答したのでついでにJavaも。
xebme

2021/08/21 10:35

ヒントのつもりで回答しましたが、実は、拡張子の定義はおろそかなままです。3文字4文字のみを拡張子とするのか。OS(win/mac,linux)によっても意味が変わるでしょう。また、拡張子の判定はファイルのみ行えばよいのか、その際ソートキーの間に依存関係ができるかもしれないが、そのことを問題にしているのだろうか。まず仕様を明確にしましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問