🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

ソート

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

Q&A

解決済

3回答

1399閲覧

2つのリストの並び替え

d_96a

総合スコア15

Java

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

ソート

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

0グッド

0クリップ

投稿2019/12/23 08:55

編集2019/12/23 09:44

###実現したいこと
num[2,1,3] fizz[ab,cd]という2つのlistが入力された状態で
numを昇順に並び替え(最後の要素を省く)、fizzもその要素番号に対応して並び替える方法はないでしょうか。
また、並び替え前のlistのindexを保持する方法はないでしょうか。
上記の方法をご存じであればご提示いただけると幸いです。
###対応する並び替え
num[2,1,4]→num[1,2,4]  num[0]⇔num[1]
fizz[ab,cd]→fizz[cd,ab]   fizz[0]⇔fizz[1]

###理想

入力: num[2,1,4] fizz[ab,cd] 出力: cdab

java

1 boolean flag=false; 2 int m = num.get(num.size()-1); 3 for(int i=0;i<num.size()-1;i++) { 4 if(m%num.get(i)==0) { 5 Collections.sort(num); 6 System.out.print(fizz.get(i)); 7 flag=true; 8 }else if(flag==false&&m>2){ 9 for(i = 2; i < m-1; i++){ 10 if(m % i == 0) { 11 System.out.println(m); 12 }else{ 13 System.out.println("prime"); 14 }return; 15 } 16 }else if(flag==false&&m<=2){ 17 System.out.println(m); 18 return; 19 } 20 }

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

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

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

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

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

azuapricot

2019/12/23 09:04

「対応して並び替える」と仰いますが、何が対応してるのかわからないのでは?
xebme

2019/12/23 09:22

インデックスソートは検討されましたか?
d_96a

2019/12/23 09:31

インデックスソート自体はじめて聞きました。 調べてみましたが、なかなか出てこないのですが、どのような方法なのでしょうか。
xebme

2019/12/23 10:57

もひとつ配列を作ります。その配列にnumのインデックスを入れ、 numそのもの(fizzも)を並べ替えるかわりにインデックスを並べ替えます。
kazuma-s

2019/12/23 15:45

num[2,4,1]→num[1,2,4] のとき fizz[ab,cd] はどうなってほしいんですか?
d_96a

2019/12/24 00:58

kazum-sさん 対応する並び替えに記載しておりますので、 ご覧ください。
kazuma-s

2019/12/24 02:39

「対応する並び替え」に記載されているのは num[2,1,4]。 私が尋ねているのは num[2,4,1] の場合です。
d_96a

2019/12/24 02:46

最後の要素は並び替えないと前提を置いておりますので、 その場合は、fizzの要素は動かないのが正になります。
jimbe

2019/12/24 05:11 編集

一連のご質問は [FizzBuzz問題を解くコードを簡略化及び汎用化したい]( https://teratail.com/questions/230747 ) のパラメータ解析の部分でしょうか. であれば, 微細な部分のご質問よりも, どのようなパラメータから最終的にどのような構造にしたいのかをご説明されたほうが早いように思います. 例えば, TreeMap は key の値で自動的に並び替えられます. m 以外のペアのデータを TreeMap に入れれば, ソートを自分でする必要はありません.
guest

回答3

0

num[2,1,3] fizz[ab,cd]という2つのlistが入力された状態で

numを昇順に並び替え(最後の要素を省く)、fizzもその要素番号に対応して並び替える方法はないでしょうか。
また、並び替え前のlistのindexを保持する方法はないでしょうか。

それらをひとまとめにしたクラスを作ってしまうのが一番単純だと思います。

java

1class DataSet { 2 public final int index, num; 3 public final String fizz; 4 5 public DataSet(int _index, int _num, String _fizz) { 6 index = _index; 7 num = _num; 8 fizz = _fizz; 9 } 10} 11 12public class Main { 13 public static void main(String[] args) { 14 int[] num = {2, 1, 3}; 15 String[] fizz = {"ab", "cd"}; 16 DataSet[] dSet = new DataSet[num.length - 1]; 17 for (int i = 0; i < num.length - 1; i++) { 18 dSet = new DataSet(i, num[i], fizz[i]); 19 } 20 // 以下略 21 }

投稿2019/12/23 18:40

swordone

総合スコア20669

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

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

d_96a

2019/12/24 01:01

ご回答ありがとうございます。 今回はリストでの問題定義になるのですが、 swordoneさんの回答は配列に変換した上で上記のクラスを実装するという認識でよいですか??
swordone

2019/12/24 01:36

配列だろうとリストだろうと、根本は同じです。
d_96a

2019/12/24 02:47

なるほど、リストに対して理解ができていない部分が多いので この機会に少し勉強したいと思います。 ご回答ありがとうございます。
guest

0

ベストアンサー

コード修正版

Java

1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4import java.util.Collections; 5import java.util.Comparator; 6 7public class Main { 8 public static void main(String[] args) { 9 List<Integer> num = Arrays.asList(2,3,5,1,15,30,60); 10 List<String> fizz = Arrays.asList("bon","kabe","don","ban","don","gon"); 11 12 System.out.println("num: " + num); 13 System.out.println("fizz: " + fizz); 14 15 List<Integer> index = new ArrayList(num.size() - 1); 16 for (var i = 0; i < num.size() - 1; i++) { 17 index.add(i); 18 } 19 Collections.sort(index, (i1, i2) -> num.get(i1) - num.get(i2)); 20 21 List<Integer> oldNum = new ArrayList<>(num); 22 for (var i = 0; i < index.size(); i++) { 23 num.set(i, oldNum.get(index.get(i))); 24 } 25 List<String> oldFizz = new ArrayList<>(fizz); 26 for (var i = 0; i < index.size(); i++) { 27 fizz.set(i, oldFizz.get(index.get(i))); 28 } 29 30 System.out.println("index: " + index); 31 System.out.println("num: " + num); 32 System.out.println("fizz: " + fizz); 33 } 34}

投稿2019/12/23 10:08

編集2019/12/24 05:13
shiracamus

総合スコア5406

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

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

d_96a

2019/12/24 01:07

コードの出力結果まで詳しくご回答ありがとうございます。 リスト内の要素が初期化ではなく、入力によって得られるものの場合は要素数等が変わってくるかと思われるのですが、 その際にshiracamusさんに記載していただいた下記コードはどのように対応したらよいのでしょうか。 Collections.sort(index, (i1, i2) -> num.get(i1) - num.get(i2)); Collections.sort(fizz, (s1, s2) -> num.get(fizz.indexOf(s1)) - num.get(fizz.indexOf(s2))); Collections.sort(num);
shiracamus

2019/12/24 01:39

.size() でサイズに合わせて処理しているので、そのまま動くと思います。 fizz のサイズが num のサイズと違っていて、範囲外に移動してしまった場合にはエラーになりますけど。
d_96a

2019/12/24 02:14

上記コードだとnumの最後の要素も含めてソートしてしまうのですね。 今回は最後の要素だけ別のリストに格納して対応しましたが、 Collections.sortには最後の要素を省いて並び替える方法等ありますでしょうか。
shiracamus

2019/12/24 02:34

fizzのサイズ分だけ処理したいということですか? 回答欄に書いておきました。
d_96a

2019/12/24 02:49

回答の変更ありがとうございます。 fizzのサイズ分だけというよりは num[4,3,2]があったとして、num[3,4,2]と最後の要素を省いて並び替えをするというものを探しております。
shiracamus

2019/12/24 02:59

List<Integer> index = new ArrayList(fizz.size()); を List<Integer> index = new ArrayList(num.size() - 1); にすればいいだけでは?
d_96a

2019/12/24 03:01

あ、今気づきました。 確かにそちらの方がいいですね。。。
swordone

2019/12/24 03:22

そこを変えても意味ないですよ
d_96a

2019/12/24 03:38

どっちが正なんでしょう??
d_96a

2019/12/24 04:35

shiracamusさんに記載していただいた以下のコードで実行した場合 Collections.sort(index, (i1, i2) -> num.get(i1) - num.get(i2)); Collections.sort(fizz, (s1, s2) -> num.get(fizz.indexOf(s1)) - num.get(fizz.indexOf(s2))); Collections.sort(num); 下記のようにfizzの中身に重複がある場合に正常に並び替えできていません。 入力:num[2,3,5,1,15,30,60] fizz[bon,kabe,don,ban,don,gon] 出力:num[1,2,3,5,15,30,60] fizz[don, ban, bon, kabe, don, gon] ※期待する結果としてはfizz[ban,bon,kabe,don,don,gon]となります。 ※なお、60はソート前にリストから削除しています。
shiracamus

2019/12/24 04:42 編集

そのコードには重複がない前提なら、と書いておきましたよ。 今掲載しているコードなら重複があっても大丈夫です。
d_96a

2019/12/24 05:02

重複の前提の見落とし申し訳ありません。 現在回答欄に掲載していただいているコードだと 期待値が[ban,bon,kabe,don,don,gon]であるのに対し、 [kabe,don,ban,bon,don,gon]と出力されてしまっています。
shiracamus

2019/12/24 05:14 編集

申し訳ありません。 インデックス指定に誤りがあったため、修正しました。
d_96a

2019/12/24 05:22

重複していても正常に並び替えられておりました。 ご丁寧に何度も修正していただきありがとうございます!
guest

0

shiracamusさんのコードを参考に下記のようにコードを変更すると、
本来の目的であったnumの最後の要素以外を並び替え、
numのindexに対応するようにfizzの要素も並び替え出力することができました。

java

1int flag=0; 2 Collections.sort(index, (i1, i2) -> num.get(i1) - num.get(i2)); 3 4 List<Integer> oldNum = new ArrayList<>(num); 5 for (int i = 0; i < index.size(); i++) { 6 num.set(i, oldNum.get(index.get(i))); 7 } 8 List<String> oldFizz = new ArrayList<>(fizz); 9 for (int i = 0; i < index.size(); i++) { 10 fizz.set(i, oldFizz.get(index.get(i))); 11 } 12 int m = list.get(list.size()-1); 13 for(int i=0;i<num.size();i++) { 14 if(m%num.get(i)==0) { 15 System.out.print(fizz.get(i)); 16 }else{ 17 flag += 1; 18 } 19 }if(flag==num.size()&&m>2){ 20 for(int i=0;i<num.size();i++) { 21 for(i = 2; i < m; i++){ 22 if(m % i == 0) { 23 System.out.println(m); 24 }else{ 25 System.out.println("prime"); 26 }return; 27 } 28 } 29 }else if(flag==num.size()&&m<=2){ 30 System.out.println(m); 31 return; 32 }

投稿2019/12/24 02:59

編集2019/12/24 05:25
d_96a

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問