//****************************************************************************** //* クラス 名: INF_Array_Sort() //* //* 概 要: 2次元String配列ソート //* 2次元String配列(String 配列[行][列])の列項目をキーとして、 //* 配列をソートする。 //* キーは第3キーまで指定可能で、各キーでソート順を指定可能。 //* //* メソッド名: @quickSort(String p1[][], int p2, boolean p3) //* p1:ソート対象の2次元String配列 //* p2:ソートキーの配列インデックス(0からスタート) //* p3:ソート順:true=昇順、false=降順 //* AquickSort(String p1[][], int p2, boolean p3, //* int p4, boolean p5) //* p1:ソート対象の2次元String配列 //* p2:第1ソートキーの配列インデックス(0からスタート) //* p3:第1ソート順:true=昇順、false=降順 //* p4:第2ソートキーの配列インデックス(0からスタート) //* p5:第2ソート順:true=昇順、false=降順 //* BquickSort(String p1[][], int p2, boolean p3, //* int p4, boolean p5, //* int p6, boolean p7) //* p1:ソート対象の2次元String配列 //* p2:第1ソートキーの配列インデックス(0からスタート) //* p3:第1ソート順:true=昇順、false=降順 //* p4:第2ソートキーの配列インデックス(0からスタート) //* p5:第2ソート順:true=昇順、false=降順 //* p6:第3ソートキーの配列インデックス(0からスタート) //* p7:第3ソート順:true=昇順、false=降順 //* //* 種 別: 汎用クラス //* 作 成 者: (株)SystemInfinity //* 作 成 日: 2001/05/18 //* 開発環境 : java version "1.3" //* //* 備 考 : その他注意事項等を記述 //* //****************************************************************************** //* Copyright (C) 2001 System Infinity Corporation. All rights reserved. //****************************************************************************** import java.util.*; public class INF_Array_Sort { //****************************************************************************** //* コンストラクタ //****************************************************************************** public INF_Array_Sort() { } // END INF_Array_Sort //****************************************************************************** //* メソッド:2次元String配列ソート(ソートキー1つ) //****************************************************************************** public void quickSort(String a[][], int point1, boolean sort1) { //配列がnullまたはキーインデックスが配列外の時、処理中断 if ((a == null) || (point1 >= a[0].length)) return; INF_Array_Sort.quickSort(a, point1, sort1, 0, a.length-1); } // END quickSort //****************************************************************************** //* 内部メソッド:2次元String配列ソート(ソートキー1つ) //****************************************************************************** protected static void quickSort(String a[][], int point1, boolean sort1, int lo0, int hi0) { int lo = lo0; int hi = hi0; String mid1; if ( hi0 > lo0 ) { mid1 = a[ ( lo0 + hi0 ) / 2 ][point1]; while( lo <= hi ) { //キー項目の比較 if ( sort1 == true ) { //第1キー:昇順 while( ( lo < hi0 ) && ( a[lo][point1].compareTo(mid1) < 0 ) ) ++lo; while( ( hi > lo0 ) && ( a[hi][point1].compareTo(mid1) > 0 ) ) --hi; } else { //第1キー:降順 while( ( lo < hi0 ) && ( a[lo][point1].compareTo(mid1) > 0 ) ) ++lo; while( ( hi > lo0 ) && ( a[hi][point1].compareTo(mid1) < 0 ) ) --hi; } if( lo <= hi ) { INF_Array_Sort.swap(a, lo, hi); ++lo; --hi; } } if( lo0 < hi ) INF_Array_Sort.quickSort( a, point1, sort1, lo0, hi ); if( lo < hi0 ) INF_Array_Sort.quickSort( a, point1, sort1, lo, hi0 ); } } // END quickSort //****************************************************************************** //* メソッド:2次元String配列ソート(ソートキー2つ) //****************************************************************************** public void quickSort(String a[][], int point1, boolean sort1, int point2, boolean sort2) { //配列がnullまたはキーインデックスが配列外の時、処理中断 if ((a == null) || (point1 >= a[0].length) || (point2 >= a[0].length)) return; INF_Array_Sort.quickSort(a, point1, sort1, point2, sort2, 0, a.length-1); } // END quickSort //****************************************************************************** //* 内部メソッド:2次元String配列ソート(ソートキー2つ) //****************************************************************************** protected static void quickSort(String a[][], int point1, boolean sort1, int point2, boolean sort2, int lo0, int hi0) { int lo = lo0; int hi = hi0; String mid1; String mid2; if ( hi0 > lo0 ) { mid1 = a[ ( lo0 + hi0 ) / 2 ][point1]; mid2 = a[ ( lo0 + hi0 ) / 2 ][point2]; while( lo <= hi ) { //キー項目の比較 if ( sort1 == true && sort2 == true ) { //第1キー:昇順、第2キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 ))) ) --hi; } else if ( sort1 == true && sort2 == false ) { //第1キー:昇順、第2キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 ))) ) --hi; } else if ( sort1 == false && sort2 == true ) { //第1キー:降順、第2キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 ))) ) --hi; } else { //第1キー:降順、第2キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 ))) ) --hi; } if( lo <= hi ) { INF_Array_Sort.swap(a, lo, hi); ++lo; --hi; } } if( lo0 < hi ) INF_Array_Sort.quickSort( a, point1, sort1, point2, sort2, lo0, hi ); if( lo < hi0 ) INF_Array_Sort.quickSort( a, point1, sort1, point2, sort2, lo, hi0 ); } } // END quickSort //****************************************************************************** //* メソッド:2次元String配列ソート(ソートキー3つ) //****************************************************************************** public void quickSort(String a[][], int point1, boolean sort1, int point2, boolean sort2, int point3, boolean sort3) { //配列がnullまたはキーインデックスが配列外の時、処理中断 if ((a == null) || (point1 >= a[0].length) || (point2 >= a[0].length) || (point3 >= a[0].length)) return; INF_Array_Sort.quickSort(a, point1, sort1, point2, sort2, point3, sort3, 0, a.length-1); } // END quickSort //****************************************************************************** //* 内部メソッド:2次元String配列ソート(ソートキー3つ) //****************************************************************************** protected static void quickSort(String a[][], int point1, boolean sort1, int point2, boolean sort2, int point3, boolean sort3, int lo0, int hi0) { int lo = lo0; int hi = hi0; String mid1; String mid2; String mid3; if ( hi0 > lo0 ) { mid1 = a[ ( lo0 + hi0 ) / 2 ][point1]; mid2 = a[ ( lo0 + hi0 ) / 2 ][point2]; mid3 = a[ ( lo0 + hi0 ) / 2 ][point3]; while( lo <= hi ) { //キー項目の比較 if ( sort1 == true && sort2 == true && sort3 == true ) { //第1キー:昇順、第2キー:昇順、第3キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) > 0 ))) ) --hi; } else if ( sort1 == true && sort2 == true && sort3 == false ) { //第1キー:昇順、第2キー:昇順、第3キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) < 0 ))) ) --hi; } else if ( sort1 == true && sort2 == false && sort3 == true ) { //第1キー:昇順、第2キー:降順、第3キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) > 0 ))) ) --hi; } else if ( sort1 == true && sort2 == false && sort3 == false ) { //第1キー:昇順、第2キー:降順、第3キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) < 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) > 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) < 0 ))) ) --hi; } else if ( sort1 == false && sort2 == true && sort3 == true ) { //第1キー:降順、第2キー:昇順、第3キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) > 0 ))) ) --hi; } else if ( sort1 == false && sort2 == true && sort3 == false ) { //第1キー:降順、第2キー:昇順、第3キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) < 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) > 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) < 0 ))) ) --hi; } else if ( sort1 == false && sort2 == false && sort3 == true ) { //第1キー:降順、第2キー:降順、第3キー:昇順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) < 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) > 0 ))) ) --hi; } else { //第1キー:降順、第2キー:降順、第3キー:降順 while( ( lo < hi0 ) && (( a[lo][point1].compareTo(mid1) > 0 ) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) > 0 )) || (( a[lo][point1].compareTo(mid1) == 0 ) && ( a[lo][point2].compareTo(mid2) == 0 ) && ( a[lo][point3].compareTo(mid3) > 0 ))) ) ++lo; while( ( hi > lo0 ) && (( a[hi][point1].compareTo(mid1) < 0 ) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) < 0 )) || (( a[hi][point1].compareTo(mid1) == 0 ) && ( a[hi][point2].compareTo(mid2) == 0 ) && ( a[hi][point3].compareTo(mid3) < 0 ))) ) --hi; } if( lo <= hi ) { INF_Array_Sort.swap(a, lo, hi); ++lo; --hi; } } if( lo0 < hi ) INF_Array_Sort.quickSort( a, point1, sort1, point2, sort2, point3, sort3, lo0, hi ); if( lo < hi0 ) INF_Array_Sort.quickSort( a, point1, sort1, point2, sort2, point3, sort3, lo, hi0 ); } } // END quickSort //****************************************************************************** //* 内部メソッド:行スワップ //****************************************************************************** protected static void swap(String a[][], int i, int j) { //配列のi行とj行をスワップする String strTemp; for (int k = 0; k < a[0].length; k++) { strTemp = a[i][k]; a[i][k] = a[j][k]; a[j][k] = strTemp; } } // END swap } // CLASS END INF_Array_Sort