• 締切済み

List配列の検索

インスタンス化されているJavaBeanがArrayListに数百~数千入っています。その配列から特定のJavaBeanのメンバーの内容が一致しているオブジェクトだけ取り出したいです。イテレーターを使って1個1個取り出してチェックして・・・というプログラムをゴリゴリ書いても良いのですが、SQLみたいに一致した条件のオブジェクトをまとめて取得するなんて事はできないのでしょうか? --- Goods.java --- import java.io.*; public class Goods implements Serializable{ private String name; private double price; private int stock; public Goods(){ } public Goods( String name, double price, int stock ){ this.name = name; this.price = price; this.stock = stock; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } } というBeanがあり、仮に下記ロジックでaddし検索 --- mainlogic --- ArrayList<Goods> goodsList = new ArrayList<Goods>(); goodsList.add( new Goods("ABC",123,10) ); goodsList.add( new Goods("DEF",456, 0) ); // ←該当オブジェクト goodsList.add( new Goods("GHI",789,15) ); goodsList.add( new Goods("JKL",987, 0) ); // ←該当オブジェクト ・・・ // ここでgoodsListに入っているGoodsオブジェクトのメンバーstock(在庫数)が0のGoodsオブジェクトを取得したい ・・・ という感じなのですが、SQLなら"SELECT * FROM goodsList WHERE Goods.stock = 0"で簡単に抽出できるのですが、このような事ってできないですよね? やはり、イテレーターで全件検索か、一旦、オブジェクトをDBに書き出して取り出すという事しかできないですよね? 他に何か良い方法などありましたら、ご教授お願い致します。

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

他のライブラリに頼るし,あまり手間かわらなそうだけど, C#っぽく書くなら org.apache.commons.collections.CollectionUtilクラスと http://leda.science.uoit.ca/java-libraries/collections-generic-4.01/javadoc/org/apache/commons/collections15/CollectionUtils.html#select%28java.util.Collection,%20org.apache.commons.collections15.Predicate%29 でPredicateインターフェースを実装した匿名クラスを使って書くかなあという気がする。実際やってないからわからないけど。 http://oshiete1.goo.ne.jp/qa4950019.html #C#だとList<T>に直接FindAllメソッドがあるんだよなあ ##…っていう回答でいいのかなぁ

gigamac
質問者

補足

実はCollectionsクラスやComparatorインターフェイスは検討材料として既にテストとかしてみたのですが、もっと簡潔にできないものかと模索しているところでした。 >>#C#だとList<T>に直接FindAllメソッドがあるんだよなあ ですね。Javaでも標準APIにあると助かるのにと思いました。

関連するQ&A

  • 実引数リストと仮引数リストの長さが異なります

    実引数と仮引数はあっているはずですが、次のエラーが出ます。どうしてでしょうか? ------エラー----------------------- java: クラス Itemのコンストラクタ Itemは指定された型に適用できません。 期待値: 引数がありません 検出値: java.lang.String,int,java.util.Date 理由: 実引数リストと仮引数リストの長さが異なります -------------------------------------------------- public class Main { public static void main(String[] args) { String name= "test"; int price = 0; Date date = new Date(); Item item = new Item(name,price,date);//コンストラクタ実引数 } } class Item{ String name; int price; Date date; void Item(String name, int price, Date date)//コンストラクタ仮引数 { this.name = name; this.price = price; this.date = date; } }

    • ベストアンサー
    • Java
  • StrutsのiterateタグでListに格納されているBeanの要素を表示する方法

    タイトルのように Strutsのiterateタグを使用して、 ArrayListに格納されているBeanの要素を表示しようとしています。 具体的には public class Test { // 実際にはmainではないですが。 public static void main( String[] args ) { TestBean tbean = new TestBean( "あいうえお", "10" ); ListBean lbean = new ListBean(); lbean.setList( tbean ); } } public class TestBean { private String name; private String age; public TestBean( String name, String age ) { this.name = name; this.age = age; } } public class ListBean { private ArrayList list; public ListBean(){ } public void setList( TestBean bean ) { this.list.add( bean ); } public ArrayList getList() { return this.list; } } というような構成で、JSPでiterateタグを利用して、 listに入っているBeanから、更にnameとageを取得して 表示させたいのです。 ご回答お願いします。

  • javaの課題でjava.lang.NullPointerExcept

    javaの課題でjava.lang.NullPointerException というエラーが出て困っています いろいろ調べてやってみたのですがどうしても解決しないのでお願いします class ShoppingBag { private ShoppingBag[] Bag; private String name; private int price; private int sum; private int iLength; public ShoppingBag() { this.Bag = new ShoppingBag[20]; this.iLength = 0; } public void add(Shampoo bag) { this.Bag[iLength].price = bag.getPrice(); this.Bag[iLength].name = bag.getName(); sum += bag.getPrice(); iLength++; } public void add(Pc bag) { this.Bag[iLength].price = bag.getPrice(); this.Bag[iLength].name = bag.getName(); sum += bag.getPrice(); iLength++; } public void add(Book bag) { Bag[iLength].price = bag.getPrice(); this.Bag[iLength].name = bag.getName(); sum += bag.getPrice(); iLength++; } public int getSumPrice() { return sum; } public void printList() { for(int i = 0; i <iLength; i++){ } } } でthis.Bag[iLength].price =で代入するところでエラーが出ます

  • DB接続 二次元配列 指定表示

    DB接続でデータを取得したいとおもっています 今DBで3×10のデータがはいっており、... DB接続でデータを取得したいとおもっています 今DBで3×10のデータがはいっており、取得、二次元配列に返してあげている状態です この例だと3列(TESTNO、KANA、NAME)だと取得できるのですが TESTNO,KANA の二列取得をしたときにエラーが発生してしまいます どのように改善すればエラーが発生せず、取得できるようになりますか? それともこのロジック自体がまずいのでしょうか? アドバイスお願いします ソース一部 public String[][] selectExec(String sql) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //KAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 while(aa.next()){ //Resultsetが最終行になるまで実行 TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } public String[][] hairetu(ArrayList T,ArrayList N ,ArrayList K){ String[][]all=new String[3][T.size()]; all[0] = (String[])T.toArray(new String[0]);//配列TSETNOに収納 all[1] = (String[])N.toArray(new String[0]);//配列NAMEに収納 all[2] = (String[])K.toArray(new String[0]);//配列KANAに収納 return all; よろしくお願いします

    • ベストアンサー
    • Java
  • メソッド オーバーロード ete

    こんにちは 今オーバーロードやメソッドについて学習中です 今回作成したのはDB接続の 処理をするほうのクラスなのですが 同じソースはひとつにまとめろといわれました 自分なりに メソッドを作ってまとめてみたのですが まだだめなようです あとどのようにまとめれば 良いとおもいますか? 例文なども出していただけると助かります 一部ソースのせます public String[][] selectExec(String sql, int fromIdx) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用のArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //NAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 aa.relative(fromIdx-1); //カーソルの位置を移動 while(aa.next()){ TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 hairetu(TESTNO,NAME,KANA); //配列に収納するメソッド呼び出し return hairetu(TESTNO,NAME,KANA); } /* * すべての行を取得 */ public String[][] selectExec(String sql) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //KAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 while(aa.next()){ //Resultsetが最終行になるまで実行 TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } /* * 指定された行から行を取得 */ public String[][] selectExec(String sql, int fromIdx,int toIdx) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //NAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 aa.relative(fromIdx); while(fromIdx<=toIdx){ TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); aa.next(); fromIdx++; } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } public String[][] hairetu(ArrayList T,ArrayList N ,ArrayList K){ String[][]all=new String[3][T.size()]; all[0] = (String[])T.toArray(new String[0]);//配列TSETNOに収納 all[1] = (String[])N.toArray(new String[0]);//配列NAMEに収納 all[2] = (String[])K.toArray(new String[0]);//配列KANAに収納 return all; }/* リストから配列に収納するメソッド。 配列でリターンします */ 下のhairetuメソッドはあとから作成しました。 もうひとつ作ったのですが TEST(TESTNO,aa,"TESTNO"); TEST(NAME,aa,"NAME"); TEST(KANA,aa,"KANA"); 呼び出し↑ メソッド public ArrayList TEST(ArrayList T,ResultSet a ,String s) throws SQLException{ T.add(a.getString(s)); // リストにSQL文を収納 return T; } これは却下されました 見づらいとは思いますが いろいろアドバイスください

    • ベストアンサー
    • Java
  • ArrayListを使ったJavaコンパイルがうまくいかない

    題名どおりなのですが、まず以下のようなソースを 書きました。 import java.util.*; class Rab{ private String name; private int number; public Rab(){ name= ""; number=0; } public void setName(String name){ this.name=name; } public void setNumber(int number){ this.number=number; } public String getName(){ return name; } public int getNumber(){ return number; } } public class Rabexc{ public static void main(String[] args){ Rab[] rab=new Rab[5]; for(int i=0; i<5; i++){ rab[i]=new Rab(); } rab[0].setName("Owner"); rab[1].setName("Adminstrator"); rab[0].setNumber(1); rab[1].setNumber(2); ArrayList al=new ArrayList(); al.add(rab[0]); al.add(rab[1]); for(int i=0; i<al.size(); i++){ rab[i]=(Rab)al.get(i); System.out.println("name: "+rab[i].getName()+"number: "+rab[i].getNumber()); } } } これを実行してみたところ、 Rabexc.java:41: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add (E) への無検査呼び出しです。 al.add(rab[0]); ^ Rabexc.java:42: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add (E) への無検査呼び出しです。 al.add(rab[1]); ^ 警告 2 個 という警告が出てコンパイルできません。 サイト・参考書なども調べて考えていたのですが、いまいち問題の解決法が浮かばないため、詳しい方いましたら教えていただけると幸いです。 宜しくお願い致します。

  • javaでリストにオブジェクトを入れたい

    ユーザー情報を配列にしたものをセッターを使い、オブジェクトをリストに入れる処理をしたいです。 例(yamada,pas1,山田) リストを使用しているのは後々他のユーザーを追加する予定の為です。 例(yamada,pas1,山田) (suzuki,pas2,鈴木) リストにlist.add("yamada")などと入力すれば表示させることが出来るのですが、 オブジェクトを入れるとうまくいきません。list.add(オブジェクト名); 実行するとコンソールに「GetUser@19e0bfd」のようなものが出てきます。どうすればよろしいでしょうか? ここから上は省略。カプセル化したゲッターセッターの処理をしています。 public static void main(String[] args){   GetUser gu = new GetUser();//ユーザー情報をnew      String name[]=new String[3];   name[0]="yamada";   name[1]="pas1";   name[2]="山田";   gu.setId(name[0]);   gu.setPass(name[1]);   gu.setName(name[2]);   List list = new ArrayList();   list.add(gu); }

    • ベストアンサー
    • Java
  • 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); } } ソースは以上です。よろしくお願いします。

  • 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
  • またしてもjava.until.Mapに関してです

    いつもお世話になっております。以前質問したjava.until.Mapに関してですが、以下のプログラムのjava.until.List部分を変えるとどういった風になるのでしょうか? 何卒ご回答よろしくお願い致します。 class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard( "山田一郎"); manager.addCustomerCard( "鈴木太郎"); manager.addCustomerCard( "田中次郎"); manager.printAllInfo(); } private List<CustomerCard> customers = new ArrayList<CustomerCard>(); private int index = 0; public void addCustomerCard(String name){ customers.add(new CustomerCard(1 + index,name)); index++; } public void printAllInfo() { for(CustomerCard cc : customers){ System.out.print("ID =" + cc.id + ","); System.out.println("名前 =" + cc.name); } } } class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } }

    • ベストアンサー
    • Java