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

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

ただいまの
回答率

90.76%

  • Java

    13154questions

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

  • ソート

    60questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,174

b_b_b

score 17

前提・実現したいこと

文字列のリストを文字列の長さの長い順にソートする関数sortByLength()を完成させたいです。

実装内容

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

該当のソースコード

import java.util.*;
import java.util.stream.Collectors;
import java.util.Collections;

public class Main {
  public static List<String> sortByLength(List<String> input) {
    // TODO 文字列の長い順でソートして返す。(文字列長が同じ場合は辞書順とする)
    input.sort((a, b) -> b.length() - a.length());
    return input;
  }
}

試したこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

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

input.sort(
    (a, b) -> a.length() == b.length()
           ? a.compareTo(b)
            : b.length() - a.length()
);

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

public static void main(String[] args) {
    List<String> myList = new ArrayList<>(
            Arrays.asList("airplane", "banana", "carrot", "apple", "dog", "egg")
    );
    List<String> resultList = new ArrayList<>(myList);

    for(int i = 0; i < 100; i++) {
        Collections.shuffle(myList);
        myList = sortByLength(myList);
        if(!resultList.equals(myList)) System.exit(1);
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/30 23:13

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

    キャンセル

  • 2017/09/30 23:16

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

    キャンセル

+1

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

import java.util.*;
import java.util.stream.Collectors;
import java.util.Collections;

public class Main {
  public static List<String> sortByLength(List<String> input) {
    // TODO 文字列の長い順でソートして返す。(文字列長が同じ場合は辞書順とする)
    input.sort(Comparator.<String>comparingInt(String::length).reversed().thenComparing(Comparator.naturalOrder()));
    return input;
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 解決済

    入力した値を表示させない方法

    初めまして。現在JAVAを学んでいる初心者です。 現在、配列に格納している値を表示させるプログラムを作っています。 ユーザーから入力があった場合、次に配列の値を表示させるとき、

  • 解決済

    文字列バッファについて

    言語はJavaにしていますが、Javaに限った話ではありません。 私が勉強している本で次のような記述がありました。 「文字列のリストを連結するときを考えます。すべての文字列

  • 解決済

    Javaでそれぞれの英単語のTFIDFの求め方がわかりません。

    Javaを独学で勉強中のJava初心者です。Javaで英文テキストファイルを読み込みそれぞれの英単語のTFIDFを表示させるプログラムを作りたいのですが、どうしてもうまくできません

  • 解決済

    Javaでのcsv読み取り、合計、上位5位のみ書き出し

    前提・実現したいこと 1)Javaで下図のようなcsvデータ(学校のテストの結果)を読み取る 氏名,英語,国語,数学 山田,80,70,60, 佐藤,70,50,90,

  • 解決済

    java リスト 並び替え

    テキストファイルからデータを読み込んで、ソート(金額順)をかけたいのですが、文字列で読み込んでいるため、金額でソートしようとしてもうまくいきません。 テキストデータは(1 H

  • 解決済

    Java 2つの配列の中身を比較

    Javaです。 例えばa1とa2というString型配列を用意します。 a1には{あ、い、う、え、お}が入っており、 a2には{か、き、く、け、こ}が入っているとします。

  • 解決済

    配列の分割方法について

    問題点 以下のような配列 String str[]={"ABC","DEFG","HI","KLM"} というのがあったとして、これを new_str[]={"A","B",・・・

同じタグがついた質問を見る

  • Java

    13154questions

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

  • ソート

    60questions

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