• 締切済み

配列の抽出

たびたび失礼します 以下のようなプログラムを記述しました private String[] setWorst(String[] score,String[] score2,String[] score3){ //ソート Data[] Datas = new Data[score.length]; for(int i = 0; i < Datas.length; i++){ Data Data = new Data(); Datas[i] = Data; Data.score = Integer.valueOf(score[i]); Data.s_indicator = s_indicator[i]; Data.center = center[i]; } ScoreComparator scoreComparator = new ScoreComparator(); Arrays.sort(Datas,scoreComparator); //ワーストの抽出 ArrayList worst3 = new ArrayList(); public class Data{ Integer score; String score2; // String score2; // } public class ScoreComparator implements Comparator{ public int compare(Object o1, Object o2){ Data Data1 = (Data)o1; Data Data2 = (Data)o2; int result = Data1.score.compareTo(Data2.score); return result; } } 変数scoreを中心としたソートを作成しました。 次にscoreの値を読み込んで下位4つを抜き出してArrayList worst3に格納していきたいと思っています。 scoreには0~10の数字が入っていますので0~3を抜き出したいということです。 自分でもいろいろ試しましたが、なかなか良い考えが浮かばないので知恵を借りたいと思います。 ヒントやアイデアだけでも結構ですので、よろしくお願いします。

  • ARCIE
  • お礼率75% (22/29)
  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ん? for( int n = 0; n < 4; n++ ) {   worst3.add( Datas[n] ); } でダメなんですか ・・・ Datasに読み込まれるscoreは重複があるのでしょうか? お示しのコードには定義されていない変数、フィールドなどもあるようですが・・・ > Data.s_indicator = s_indicator[i]; > Data.center = center[i];

ARCIE
質問者

お礼

遅くなりました申し訳ありません。 ありがとうございました。

関連するQ&A

  • ソートについて

    以下のプログラムを実行すると整数のソート結果が "1","12","3"となってしまいます。 整数と文字列を分離させてそれぞれソートさせたいのですが 方法がわかりません。 import java.util.*; import java.io.*; class StrArray{ ArrayList list = new ArrayList(); //最下行に要素を追加 public void add(String data){ list.add(data); } //全ての要素を配列で所得 public String[] getAll(){ String[] all = new String[list.size()]; for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public static final int ASC_SORT = 0; public void sort(int mode){ ArrayList al = this.qsort(mode, list); al = list; } //クイックソート public ArrayList qsort(int mode, ArrayList data){ ArrayList result = new ArrayList(); if(data.size()<1){ return new ArrayList(); } String middle = (String)data.get(data.size()/2); ArrayList left = new ArrayList(); ArrayList right = new ArrayList(); for(int i=0; i<data.size(); i++){ if(i != data.size()/2){ if(mode == 0){ if(((String)data.get(i)).compareTo(middle)<=0){ left.add(data.get(i)); } else{ right.add(data.get(i)); } result.addAll(qsort(0, left)); result.add(middle); result.addAll(qsort(0, right)); return result; } return result; } } } } class Sample{ public static void main(String args[]){ StrArray alist = new StrArray(); alist.add("bbb"); alist.add("aaa"); alist.add("ddd"); alist.add("ccc"); alist.add("3"); alist.add("1"); alist.add("12"); alist.sort(0); String[] info = alist.getAll(); for(int i = 0; i < info.length; i++){ System.out.println(info[i]); } } }

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • JComboBoxの配列の作り方について

    class PdMenu extends JPanel implements ActionListener { private static final long serialVersionUID = 5962740427029989204L; /*-------------------------* * Variables. * *-------------------------*/ /*----- Pull-down menu -----*/ JComboBox[] pd=new JComboBox[10]; String[] arrDate={"00", "01", "02", "03"}; List<String> date=new ArrayList<String>(); static String[] result; /*-------------------------* * Cons. * *-------------------------*/ /*----- Creation -----*/ PdMenu() { date=Arrays.asList(arrDate); result=date.subList(0, 3).toArray(new String[]{}); for(int i=0; i<pd.length; i++){ pd[i]=new JComboBox<String>(); } pd[0]=new JComboBox<String>(result); } public void actionPerformed(ActionEvent e) { /*------*/ } } Eclipseを使用しています。 JComboBox[] pd=new JComboBox[10];の部分において、ジェネリックタイプを付けるようにと の警告が表示されている状態です。 JComboBoxの配列を作りたいのですが、ジェネリックタイプを付けると配列が作れません。 JComboBoxの配列を作る場合は、ジェネリックタイプを付ける事ができません。 警告の表示されない良い方法はありませんでしょうか? みなさま、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JAVA 配列を格納したArrayListのサイズ

    ArrayListにcsvファイルを格納する処理を作成しました。 読み込みはBufferedReaderで行単位で読み込ませ、 ArrayListの各要素には各行をカンマ区切りでわけた配列を 入れてあります。 ここで読み込むcsvファイルがデータなしの時にデータがないことを コメントする処理を入れたいのですが、ArrayListのサイズが0であるという 条件を思いつき、「length」や「size()」で条件文を作成したところ、 コンパイルされても処理が正常に走りませんでした。 条件にしている箇所があっているのか間違っているのか。 あっているならば、配列をしまってあるArrayListの要素数を 得る方法、間違っているならば、正しい条件を教えてください。 大変恐縮ですが、ご助言お願いいたします。 inName : 取り込みファイル名(argsで引っ張っています。) outName : はき出しファイル名(同上) ExceptionはIOとFileNotFoundをcatchしています。 try{ bf = new BufferedReader(new FileReader(inName)); outbf = new BufferedWriter(new FileWriter(outName)); String line; while((line = bf.readLine()) != null){ al.add(line.split(",",0)); /*for(int i=0 ; i < data.length ; i++){ al.add(data[i]); }*/ //行数0の処理を記述しようとしている箇所 } for(String[] out : al){ for(int i=0 ;i<out.length ; i++){ outbf.write(out[i]); outbf.newLine(); } } }

  • C#の動的配列について

    こんにちは。今C#でMIDIファイルを解析するプログラムを開発しているのですが、 ファイルからトラック別の音符情報を読み取ってソートするのに結構な時間がかかるのです。 データをソートするのにいちいち別のクラスに全部コピーしてるせいだと思うのですが、データをコピーせずにソートする方法はあるのでしょうか。(もしくは、もっと早い方法) //絶対時間、周波数、フラグ:1=発音 0=消音 ArrayList _time = new ArrayList(); ArrayList _freq = new ArrayList(); ArrayList _flag = new ArrayList(); ~中略~ ~↓本体の一部~ switch (lastStates & 0xF0) { case 0x80: // 音を消す case 0x90: // 音を鳴らす double hz = base_frq * Math.Pow(2.0, (d[addr + 1] - 69) / 12.0); //音の周波数 _freq.Add(hz); _time.Add((long)time);//time=算出した絶対時間 if (d[addr + 1] != 0x0 && (lastStates & 0xF0) == 0x90) _flag.Add(1); else _flag.Add(0); break; ~中略~ musicData[] list = new musicData[_time.Count]; for (int i = 0; i < _time.Count; i++) { list[i] = new musicData((long)_time[i], (int)_freq[i], (int)_flag[i]); } Array.Sort(list);//時間で並べ替え ~中略~ class musicData : IComparable<musicData> { public long time; public int frq; public int flag; public musicData(long time, int frq, int flag) { this.time = time; this.frq = frq; this.flag = flag; } int IComparable<musicData>.CompareTo(musicData other) { return this.time.CompareTo(other.time); } } ソースは以上です。よろしくお願いします。

  • 空白にはなにを入れればいいのでしょうか?

    [A君,50,60,70] -> 180 [Bさん,90,70,80] -> 240 [C君,30,40,45] -> 115 という3教科の試験の合計点を学生毎に表示するものですが、<?>の部分になんと書けばいいのかわかりません。。教えてください。 import java.lang.*; import java.io.*; import java.util.*; class Student { private String name; private int[] score; public Student (String name, int[] score){ this.name = name; this.score = score; } public Student(String name, int x, int y, int z){ this.score = new int[3]; } public String toString(){ String s = "[" + name; for (int i=0; i < score.length; i++){ s += “ , “ + score[1]; } s += "]"; return s; } public int total(){ int sum = 0; for (int i=0; i<<?>; i++){ <?> } return sum; } } class StudentTest { public static void main(String[] args){ Student[] data = { new Student("A君",50,60,70), new Student("Bさん",90,70,80), new Student("C君",30,40,45), }; for (int i=0; i<data.length; i++){ System.out.println("" + data[i] + "\t-> " + data[i].total()); } } }  

    • ベストアンサー
    • Java
  • StringクラスのcompareToメソッド

    ArrayListに登録した文字列を五十音順にソートしようと思いComparator を使用して 以下のようなサンプルプログラムを作ってみました。 ところが想定していたような {赤ちゃん、富士山、山口県}とはならず {富士山、山口県、赤ちゃん} というような結果になりました。 compare() の戻り値の部分を return ((String)arg1).compareTo((String)arg0); に変更しても{赤ちゃん、山口県、富士山} となり辞書の並びとは異なる結果になりました。 辞書順に並べるにはなにかよい方法はありますでしょうか。 public class compareTest { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); String a = "赤ちゃん"; String b = "山口県"; String c = "富士山"; array.add(a); array.add(b); array.add(c); for(int i=0;i<array.size();i++) { System.out.println("ソート前=" + array.get(i)); } Collections.sort(array, new testComp()); for(int i=0;i<array.size();i++) { System.out.println("ソート後=" + array.get(i)); } } } public class testComp implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }

    • ベストアンサー
    • Java
  • ファイル読み込みを配列に入れる方法

    ファイルから数字を読み込んで 並び替えて出力するプログラムを作成しているのですが ファイルから一度に配列に取り込んで、その配列で並び変えたいのですが取り込みができないのです、int型の配列に一度に取り込むのは可能なのでしょうか? import java.io.*; class Sort { public static void main(String[] args) { String path = args[0]; File file = new File(path); FileReader fr = null; int[] buf = new int[(int)file.length()]; try { fr = new FileReader(file); fr.read(buf); for (int i=0; i<buf.length-1;i++) { int mini=buf[i]; int miniIndex = i; for(int j = i+1; j<buf.length;j++){ if(buf[j] < mini){ mini = buf[j]; miniIndex = j; } } buf[miniIndex] = buf[i]; buf[i] = mini; } for(int i =0; i<buf.length;i++) { System.out.print( buf[i]+","); } } catch (IOException e) { System.out.println("ファイル入力エラー"); } } } と作ってみたのですが‥ ご教授お願いいたします。

    • ベストアンサー
    • Java
  • 配列の値の参照について

    下記のプログラムの-------------で囲まれた部分が、コンパイルは通るのですが実行すると"value[1][0]"以降が参照できません(ここではcount=3 となっています)。 for文を使わずに"System.out.println(value[1][0])"とすると値を取り出せるのですが…。 実行時のエラーは Exception in thread "main" java.lang.ArrayIndexOutOfBoundException: 3 です。 ソースコードをそのまま載せて長文になってしまい申し訳ありません。 プログラム初心者なので、些細なことでもいいので回答お願いします。 import java.util.*; import java.io.*; public class Search { static String dataFileName = "CityData.txt"; ArrayList<String> array = new ArrayList<String>(); GetDataCount gdc = new GetDataCount(dataFileName); int count = gdc.getCount(); int count2 = 0; String[][] value = new String[count][3]; public Search(String dataFileName){ try{ BufferedReader reader = new BufferedReader( new FileReader(dataFileName) ); String line = ""; while((line = reader.readLine()) != null){ Vector<String> variable = readLine(line); System.out.println(variable); count2++; } }catch(IOException e){ System.out.println(e); } //---------------------------------------------------------- for (int i=0; i<count2; i++){ for (int j=0; i<3; j++){ System.out.println(value[i][j]); } } //---------------------------------------------------------- } public Vector<String> readLine( String line ){ StringTokenizer st = new StringTokenizer( line, "," ); Vector<String> variable = new Vector<String>(); for( int i=0 ; i<3 ; i++ ){ String data = st.nextToken(); variable.addElement( data ); value[count2][i] = data; System.out.println(value[count2][i]); } return variable; } public class GetDataCount{ int count = 0; public GetDataCount(String dataFileName){ try{ BufferedReader reader = new BufferedReader( new FileReader(dataFileName) ); String line = ""; while((line = reader.readLine()) != null){ count++; } }catch(IOException e){ System.out.println(e); } } public int getCount(){ return count; } } public static void main(String[] args){ new Search(dataFileName); } }

  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java