Javaの配列ソートで悩んでいます…。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
XEGA

Javaの配列ソートで悩んでいます…。

#1

投稿記事 by XEGA » 13年前

JavaでAndroidアプリを作っているのですが、a[数値][順番]という2次元配列を降順に並べ替えようとしています。
しかし、ただ並び替えをしたいのではなく、

コード:

a[30,10,20,40,50][0,1,2,3,4]
のような配列を並び替えたとき、

コード:

a[10,20,30,40,50][1,2,0,3,4]
のように順番と数値の組み合わせは保持する形で並び替えたいのです。

特にこの配列や方法に固執しているわけではありません。

どなたか良い方法があればご教授して頂きたいです。
よろしくお願いします。

ゆうたろう

Re: Javaの配列ソートで悩んでいます…。

#2

投稿記事 by ゆうたろう » 13年前

構造体をつかえばいいと思います
JAVAには構造体がないみたいですが
クラスで代用できるみたいです
http://oshiete.goo.ne.jp/qa/280363.html

かずま

Re: Javaの配列ソートで悩んでいます…。

#3

投稿記事 by かずま » 13年前

TreeMap を使えばできそうですが、

コード:

import java.util.*;

class Sort2 {
    public static void main(String[] args) {
        int a[][] = {
            { 30, 10, 20, 40, 50 },
            {  0,  1,  2,  3,  4 },
        };
        Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
        for (int i = 0; i < 5; i++)
                map.put(a[0][i], a[1][i]);
        int k = 0;
        for (int key : map.keySet()) {
            a[0][k] = key;
            a[1][k++] = map.get(key);
        }
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 5; j++)
                System.out.printf("%3d", a[i][j]);
            System.out.println();
        }
    }
}

XEGA

Re: Javaの配列ソートで悩んでいます…。

#4

投稿記事 by XEGA » 13年前

皆様素早く丁寧な回答ありがとうございます。

TreeMapを使う方法で求めていたソート結果が得られそうです。
ありがとうございました。

かずま

Re: Javaの配列ソートで悩んでいます…。

#5

投稿記事 by かずま » 13年前

TreeMap を使わなくてもできそうですが、

コード:

import java.util.*;

class Sort3 {
    public static void main(String[] args) {
        int a[][] = {
            { 30, 10, 20, 40, 50 },
            {  0,  1,  2,  3,  4 },
        };
        class Pair {
            int key, value;
            Pair(int k, int v) { key = k; value = v; };
        };
        Pair[] pairs = new Pair[5];
        for (int i = 0; i < 5; i++) 
            pairs[i] = new Pair(a[0][i], a[1][i]);
        Arrays.sort(pairs, new Comparator<Pair>() {
            public int compare(Pair a, Pair b) { return a.key - b.key; }
        });
        for (int i = 0; i < 5; i++)
            System.out.printf("%3d", pairs[i].key);
        System.out.println();
        for (int i = 0; i < 5; i++)
            System.out.printf("%3d", pairs[i].value);
        System.out.println();
    }
}

XEGA

Re: Javaの配列ソートで悩んでいます…。

#6

投稿記事 by XEGA » 13年前

解決とした後で申し訳ありませんが、

コード:

a[20,10,30,40,50][0,1,2,3,4][5,6,7,8,9]
のような配列の場合、
関係を保持したままソートする方法があれば教えてください。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: Javaの配列ソートで悩んでいます…。

#7

投稿記事 by みけCAT » 13年前

交換するときに、対応する数字を一緒に交換します。

コード:

import java.util.*;
import java.lang.*;

class Main
{
	private static void sortIt(int[][] target) {
		for(int i=target[0].length-1;i>0;i--) {
			for(int j=0;j<i;j++) {
				if(target[0][j]>target[0][j+1]) {
					for(int k=0;k<target.length;k++) {
						int temp;
						temp=target[k][j];
						target[k][j]=target[k][j+1];
						target[k][j+1]=temp;
					}
				}
			}
		}
	}

	public static void main (String[] args) throws java.lang.Exception
	{
		int[][] a={
			{20,10,30,40,50},
			{ 0, 1, 2, 3, 4},
			{ 5, 6, 7, 8, 9}
		};
		sortIt(a);
		for(int i=0;i<a[0].length;i++) {
			for(int j=0;j<a.length;j++) {
				System.out.print(String.valueOf(a[j][i])+" ");
			}
			System.out.println("");
		}
	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: Javaの配列ソートで悩んでいます…。

#8

投稿記事 by みけCAT » 13年前

もう少し効率のいい方法で。

コード:

import java.util.*;
import java.lang.*;

class Main
{
	private static void sortIt(int[][] target,int start,int end) {
		int left,right;
		if(start+1>=end)return;
		if(start+2==end) {
			if(target[0][start]>target[0][start+1]) {
				for(int i=0;i<target.length;i++) {
					int temp;
					temp=target[i][start];
					target[i][start]=target[i][start+1];
					target[i][start+1]=temp;
				}
			}
			return;
		}
		int pipot=target[0][start+(end-start)/2];
		left=start;right=end-1;
		while(left<right) {
			while(left<end && target[0][left]<pipot)left++;
			while(right>=start && target[0][right]>pipot)right--;
			if(left>=right)break;
			for(int i=0;i<target.length;i++) {
				int temp;
				temp=target[i][left];
				target[i][left]=target[i][right];
				target[i][right]=temp;
			}
			left++;
		}
		if(left<=start)left=start+1;
		if(left>=end)left=end-1;
		if(left-start>end-left) {
			sortIt(target,left,end);
			sortIt(target,start,left);
		} else {
			sortIt(target,start,left);
			sortIt(target,left,end);
		}
	}

	private static void sortIt(int[][] target) {
		sortIt(target,0,target[0].length);
	}

	public static void main (String[] args) throws java.lang.Exception
	{
		int[][] a={
			{20,10,30,40,50},
			{ 0, 1, 2, 3, 4},
			{ 5, 6, 7, 8, 9}
		};
		sortIt(a);
		for(int i=0;i<a[0].length;i++) {
			for(int j=0;j<a.length;j++) {
				System.out.print(String.valueOf(a[j][i])+" ");
			}
			System.out.println("");
		}
	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: Javaの配列ソートで悩んでいます…。

#9

投稿記事 by かずま » 13年前

index をソートすれば、中身を交換しなくて済みます。

コード:

import java.util.*;

class Sort4 {
    public static void main(String[] args) {
        int a[][] = {
            { 30, 10, 20, 40, 50 },
            {  0,  1,  2,  3,  4 },
            {  5,  6,  7,  8,  9 },
        };
        Integer[] index = new Integer[5];
        for (int i = 0; i < 5; i++) index[i] = i;
        class Comp implements Comparator<Integer> {
            int[][] m;
            Comp(int[][] a) { m = a; }
            public int compare(Integer x, Integer y) {
                return m[0][x] - m[0][y];
            }
        }
        Arrays.sort(index, new Comp(a));
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++)
                System.out.printf("%3d", a[i][index[j]]);
            System.out.println();
        }
    }
}

XEGA

Re: Javaの配列ソートで悩んでいます…。

#10

投稿記事 by XEGA » 13年前

皆様色々な提案ありがとうございます。
Androidで動かしながら勉強しています。

また別の提案があれば是非教えてください。

閉鎖

“C言語何でも質問掲示板” へ戻る