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

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

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

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

ソート

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

Q&A

解決済

4回答

5189閲覧

文字列長でのソート(同じ場合は辞書順)の方法がわかりません。

b_b_b

総合スコア32

Java

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

ソート

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

0グッド

0クリップ

投稿2017/09/30 06:50

###前提・実現したいこと
文字列のリストを文字列の長さの長い順にソートする関数sortByLength()を完成させたいです。

実装内容

・この関数は、引数として文字列のList List<String> inputを受け取ります。
・文字列の長さの長い順にソートされたListを返します。
・文字列長が同じ場合は文字列の辞書順でソートするものとします。
・この関数では入力のListインスタンスそのものをソートしても構いません。

###該当のソースコード

Java

1import java.util.*; 2import java.util.stream.Collectors; 3import java.util.Collections; 4 5public class Main { 6 public static List<String> sortByLength(List<String> input) { 7 // TODO 文字列の長い順でソートして返す。(文字列長が同じ場合は辞書順とする) 8 input.sort((a, b) -> b.length() - a.length()); 9 return input; 10 } 11}

###試したこと
文字列長順にソートすることはできましたが、
文字列が同じの際に辞書順にソートする方法がわかりません。

よろしければご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

一通り答えが出ていそうなので別の考えを提示します。

ソートには安定ソートと呼ばれる種類のものがあります。これは順位が同じものについては、元の順番を維持する。というものです。ですので、これを二回使う(まあ二回目だけでもいいですが)。といった方法が挙げられます。以下、参考(ここでは安定でなく固定と訳されています)

https://docs.oracle.com/javase/jp/6/api/java/util/Collections.html#sort(java.util.List, java.util.Comparator)

投稿2017/09/30 14:57

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

こんな風にするのはいかがでしょう?あまり綺麗なコードではないですが。

Java

1input.sort( 2 (a, b) -> a.length() == b.length() 3  ? a.compareTo(b) 4 : b.length() - a.length() 5);

ついでに、適当に組んだテストコードを晒してみる。

Java

1public static void main(String[] args) { 2 List<String> myList = new ArrayList<>( 3 Arrays.asList("airplane", "banana", "carrot", "apple", "dog", "egg") 4 ); 5 List<String> resultList = new ArrayList<>(myList); 6 7 for(int i = 0; i < 100; i++) { 8 Collections.shuffle(myList); 9 myList = sortByLength(myList); 10 if(!resultList.equals(myList)) System.exit(1); 11 } 12}

投稿2017/09/30 13:47

編集2017/09/30 14:17
LouiS0616

総合スコア35660

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

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

swordone

2017/09/30 14:13

allEqualはList#equalsではだめなのか
LouiS0616

2017/09/30 14:16

大丈夫ですね。ご指摘ありがとうございます。
guest

0

単一のラムダ式では不可能です。

java

1import java.util.*; 2import java.util.stream.Collectors; 3import java.util.Collections; 4 5public class Main { 6 public static List<String> sortByLength(List<String> input) { 7 // TODO 文字列の長い順でソートして返す。(文字列長が同じ場合は辞書順とする) 8 input.sort(Comparator.<String>comparingInt(String::length).reversed().thenComparing(Comparator.naturalOrder())); 9 return input; 10 } 11}

投稿2017/09/30 13:12

編集2017/09/30 13:14
swordone

総合スコア20651

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

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

0

辞書順と指定された場合、課題等で出される範囲ではalphabetical orderと同義です。
また、文字列に含まれるものがアルファベットに限定できるのであれば、各文字の文字コードを比較すれば大小関係を取得できます。

比較する文字列の文字列長が異なる場合は考慮が必要ですが、文字列長が同じ場合は先頭の文字から順に文字コードを比べていけばよいでしょう。

まずは文字列長が同じ場合、異なる場合で処理内容を分けることからはじめてみてはいかがでしょうか。

追記:
文字コード比較をするように回答していましたが、String#compareToは説明に辞書的な比較と明記しているようです。
そのため、実装内容はcompareToで比較することを想定しているように思います。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#compareTo-java.lang.String-

投稿2017/09/30 13:09

編集2017/09/30 13:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問