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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

1回答

3388閲覧

C#で文字列を並び替える方法を教えてください。

abc2001

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2021/11/21 05:42

編集2021/11/21 06:17

前提・実現したいこと

string[] texts = new string[] { "abc", "defg", "b", "stuv", "ef", };
の要素をコンソールで表示するとき、
vuts,fe,gfed,b,cba

vuts, gfed, fe, cba,b
に並び替えて出力する方法を教えてください。

以下は問題文です。
次の文字列の配列を降順に並べ替える。
string[] texts = new string[] { "abc", "defg", "b", "stuv", "ef", };
(降順の結果)stuv,ef,defg,b,abc
更に、個々の中身までひっくり返してみる。(stringクラスにReverse()メソッドがあり、string(char[]value)コンストラクターがある。)
パターン1並び替えてから文字列反転
vuts,fe,gfed,b,cba
パターン2文字列を反転させてから並び替え
vuts, gfed, fe, cba,b

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

なし

該当のソースコード

C#ソースコード using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Q10 { class Q10 { static void Main(string[] args) { string[] texts = new string[] { "abc", "defg", "b", "stuv", "ef", }; Console.WriteLine(string.Join(", ", texts.OrderByDescending(x => x))); } } }

試したこと

stuv,ef,defg,b,abc
に並び替えるところまでは出来たのですが、そこからまた並び替える方法がわかりません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

Zuishin

2021/11/21 05:49

特に順番に意味があるようには見えないので、ソートするのではなく、要素を指定して入れ替えるのが早いのでは?
BeatStar

2021/11/21 05:54

もしかして、全てのパターンを列挙したいってことですか? 順列や組み合わせでのパターン数ではなく、{ {A,B,C}, {B,C,A}, {A,C,B} ... } という感じですべてのパターンを総当たりとかみたいにやりたいってことですか?
YAmaGNZ

2021/11/21 05:59

指定の文字列を反転させたいのですか?
abc2001

2021/11/21 06:02

ご連絡ありがとうございます。 重要な部分を書き忘れていました。申し訳ございません。 問題文は 次の文字列の配列を降順に並べ替える。 string[] texts = new string[] { "abc", "defg", "b", "stuv", "ef", }; (降順の結果)stuv,ef,defg,b,abc 更に、個々の中身までひっくり返してみる。(stringクラスにReverse()メソッドがあり、string(char[]value)コンストラクターがある。) パターン1並び替えてから文字列反転 vuts,fe,gfed,b,cba パターン2文字列を反転させてから並び替え vuts, gfed, fe, cba,b
BeatStar

2021/11/21 06:04

質問本文に書いてください。この修正依頼の欄は修正依頼のためのものです。 質問は編集できるので編集しましょう。
abc2001

2021/11/21 06:10

承知しました。 質問を修正します。
abc2001

2021/11/21 06:18

お待たせしました。 質問を編集いたしました。
BeatStar

2021/11/21 06:21

パターン1,2とありますが、二種類やれ的なものですか? それとも単純に『こんな方法もあるから』っていう提示でしょうか。
abc2001

2021/11/21 06:25

説明不足で申し訳ございません。 二種類行うものです。
Zuishin

2021/11/21 06:35

文字列を反転させる方法はそこに書いてありますが、何がわからないんでしょう?
abc2001

2021/11/21 06:44

ご連絡ありがとうございます。 Reverse()メソッドを使っても出力結果がvuts,fe,gfed,b,cbaにならないのでわからなくなってしまいました。
dodox86

2021/11/21 07:01

何といいますか、動きそうなコードやメソッドを継ぎはぎして要望通りの結果を求めるのではなく、ひとつひとつ理解して順番に片付けていかないとダメです。
guest

回答1

0

ベストアンサー

まず、プログラミングとは『こう書けばいい』…というものではありません。簡単に言えば『現実世界のシミュレーション』です。(例外はあるにはあるが、ほぼこの考えで出来ている)

なので、C#でとか○○言語でとかみたいなものは置いといて、「現実世界でならどうするか」を考えてみましょう。

たとえば今回の場合、

[お願い] 単語をいくつか書いたメモを渡すから、そこに書かれている単語を次のように処理してその結果を俺に渡してくれ。ただし、処理の流れは「処理の流れ」の項目にある感じで頼む。 [例1] abc, defg, b, stuv, ef ↓ vuts, fe, gfed, b, cba [処理の流れ] 方法1: 単語を(降順で)並び替えてからそれぞれの単語を後ろから読む 方法2: 単語を後ろから読んでいき、最後に全体を(降順で)並び替える

的な依頼かなにかを先輩からなり親御さんからなり、ご兄弟からなりの知人とかから頼まれたとします。
さて、質問者さんはどのようにしますか?

私なら、とりあえず方法1からやります。

abc, defg, b, stuv, ef とあったら、
stuv, ef, defg, b, abcのように全体を降順で並び替える。
そして、それぞれ単語レベルで見ていき、stuvを後ろから読むと vuts となる。
なので一つ目はvutsで、二つ目の単語はefですが、後ろから読むとfeとなる。
…これを最後まで繰り返すだけ。

つまり、疑似コードで書くと、

[方法1の現実世界での疑似コード] 1. 全体をソート(降順で) 2. 最初の単語から最後の単語まで一つ一つ見ていく 2.1. 現在フォーカスしている単語を後ろから読む 2.2. (2.1)で出来た単語をメモに記録する

というような感じになるはずです。言い回しとかは変えてもいいですが。

全体を文、単語レベルを単語と表現すると、文レベルでソートしてから単語を一つ一つ見ていき、それぞれ後ろから読む。

これだけです。

これを実装するだけです。

そして、方法2も同様にやってみる。

そうすると、abc, defg, b, stuv, efであれば、一つ目の単語abcを後ろから読む。するとcbaとなる。さらに次の単語defgも後ろから読む。するとgfedとなる。
...これを最後まで繰り返すとcba, gfred, b, vuts, feとなる。
そして最後に単語全体を降順でソートする。

これも疑似コードで書くと、

[方法2の現実世界での疑似コード] 1. 一つ目の単語から最後の単語まで一つ一つ見ていく 1.1. 現在の単語を後ろから読む 1.2. (1.1)をメモに記録する 2. 全体を降順でソートする

みたいになるはずです。

これを実装するだけです。

よって、

1. 方法1でやってみる 2. 方法2でもやってみる

のような流れになるはです。

ただ、『一つずつ単語を後ろから読む』処理は対象となるデータ( abcなのか stuvなのかとか) が違うだけで方法自体は同じですから、C#とかでいえばメソッドにすると楽かもしれません。

『方法1の現実世界での疑似コード』での(1)は単純にソートするだけです。降順で。
質問にあるコードでいえばtexts.OrderByDescending(x => x)の部分か。

で、ソート済みになった状態で、(2)はfor文で出来ますね。
(2.1)は質問のヒントにもあるようにReverseメソッドを使えばいい。
(2.2)は単純に文字列の配列にすればいいだけ。


[追記1]

(本回答の登録が済んだ後に修正依頼のやつを読んだので追記します)

Reverse()メソッドを使っても出力結果がvuts,fe,gfed,b,cbaにならないのでわからなくなってしまいました。

そういう場合は調べてください。プログラマやSEは『考える事』と『調べる事』が仕事です。
高校までの学校の暗記物のように暗記するのではなく、調べるのが当たり前です。

『C# 文字列 逆順』とかで検索すると、ここのようなページがヒットします。

[修正]: ※ 上記では「調べるのが当たり前」と書いていますが、課題等を丸投げしてもいいとか基礎をないがしろにしていいという意味ではありません。(マジで勘違いしている人が多すぎる…… 考えてもいないのに、「30分でわからなければ聞け」というのを鵜呑みにして課題丸投げしているのが多い。「○分でわからなければば」の真意は『30分や1時間、自分なりに考えて調べてそれでも対応できない場合は聞くべき。自分にはない発想によるものだったりするから』です。勘違いしている人が多すぎる…)

投稿2021/11/21 06:55

編集2021/11/21 07:45
BeatStar

総合スコア4958

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

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

abc2001

2021/11/21 07:29

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問