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

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

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

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

Q&A

解決済

3回答

1934閲覧

ソートを文字列に含まれるカンマ区切りの数字で行いたい

tomopi3

総合スコア19

Java

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

0グッド

1クリップ

投稿2019/07/16 05:09

編集2019/07/17 06:26

aaa, , ,59, ,
aaa, , ,17, ,
aaa, , ,02, ,

aaa, , ,02, ,
aaa, , ,17, ,
aaa, , ,59, ,

上記の様に途中にあるカンマ区切りの数字でソートしたいです。

Collections.sortで辞書的にソートすることはできました。

カンマが一つだけなら

java

1class MyComparator implements Comparator{ 2public int compare(Object obj1,Object obj2){ 3int num1; 4int num2; 5 6String str1; = obj1.toString(); 7String str1; = obj1.toString(); 8 9num1 = Integer.parseInt(str1.substring(str1.indexOf(,)+1).trim()); 10 11num2 = Integer.parseInt(str2).substring(str2.indexOf(,)+1).trim()); 12 13return num1 - num2 14} 15} 16 17Collections.sort(リスト名,new MyComparator());

上記で出来たのですが、カンマが複数ある場合に応用できませんでした。

追記
上記のコードではint型の変数でソートしていますが、実際の環境ではカンマ区切りの文字列の中には1A,1Wなどのint型に変換できないものも含まれます。
string型でソートしたいです。

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

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

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

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

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

m.ts10806

2019/07/16 05:14

えーっと・・ 職場のコードをそのままでないとはいえ公開されている場に出していいのかという疑問は大いにあるのですが、 いずれにしても「コピペで確認できるコード」が大原則なので、コピペでコードが提示できないのであれば、できるような環境において質問されたほうが良いかと思います。 でないと、回答する側が考慮しなければならない点が多すぎて、的確な回答が得られない可能性もあります(インデントあるなしで質問からバックしてしまう回答者もいるので)
LouiS0616

2019/07/16 05:33 編集

なぜ職場で直接質問できないのか、その背景が分かりません。 補足: 当初の質問には、『職場の環境上コードをコピペできないのでiPhoneの手打ちでやっています。コード全文を載せられなくてすいません。』という文言がありました。https://teratail.com/questions/history-questions/200831
tomopi3

2019/07/16 05:54

職場のpcがネットに繋がっておらず、コピペは不可です。 職場で質問できないため、こちらで質問させて頂きました。(上司のスケジュール等) ご指摘ありがとうございました。
swordone

2019/07/17 07:07

「int型に変換できないもの」の位置は各行で共通ですか?
tomopi3

2019/07/18 08:55

共通です
guest

回答3

0

自己解決

カンマ区切りではなくsubstringで文字列を切り出してソートしました。
文字列でのソートなので数字以外のアルファベット混じりでもいけました。

投稿2019/07/31 05:55

tomopi3

総合スコア19

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

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

0

java

1num1 = Integer.parseInt(str1.substring(str1.indexOf(,)+1).trim());

この書き方だと、substringの引数が1つしかありませんから、「カンマがある最初の位置の次の文字」から最後までの文字列を切り取ることになります。カンマとカンマの間の文字列を取るためには、「次のカンマの位置」を調べて、引数2個のsubstringを使う必要があります。それを実現するためには1行では厳しいです。

java

1int s1 = str1.indexOf(',') + 1; 2int e1 = str1.indexOf(',', s1); 3String a = str1.substring(s1, e1);

もっとも、substringを使うよりsplitで配列にしてしまったほうが処理は圧倒的に楽だと思います。

java

1Comparator<String> c = new Comparator<>() { 2 @Override 3 public int compare(String o1, String o2) { 4 String[] a1 = o1.split(","); 5 String[] a2 = o2.split(","); 6 int c = 0; 7 for (int i = 0; i < a1.length; i++) { 8 try { 9 int num1 = Integer.parseInt(a1[i]); 10 int num2 = Integer.parseInt(a2[i]); 11 c = Integer.compare(num1, num2); 12 } catch (NumberFormatException e) { 13 c = a1[i].compareTo(a2[i]); 14 } 15 if (c != 0) return c; 16 } 17 return 0; 18 } 19}

※上記コードは率直に書いただけなので、非常に無駄が多いです。

投稿2019/07/19 01:03

swordone

総合スコア20651

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

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

0

カンマが複数あると言っても、1つ目のカンマにマッチさせて、2つ目のカンマにマッチさせて、3つ目のカンマの手前までを取り出せば良いのでしょ。

ターゲット文字列に繰り返しマッチ の記事が参考になると思います。

投稿2019/07/16 05:22

coco_bauer

総合スコア6915

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

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

tomopi3

2019/07/17 06:21

カンマ区切りの文字列を取り出す事自体はsubstringでできました。 取り出した文字列でのソートができません。
coco_bauer

2019/07/17 07:09

質問に書かれた compare関数は、2つの文字列で最初のカンマの後を整数に変えて比較してますよね。このcompare関数を使う事で1つ目のカンマの後の数字(文字列)でソートできている。 同様に、「1つ目のカンマにマッチさせて、2つ目のカンマにマッチさせて、3つ目のカンマの手前までを取り出」して、それを整数に変えて比較するようにしたcompare関数を定義して、そのcompare関数を使たソートをすれば、希望するような動作が実現できると思うのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問