- PR -

データ構造

投稿者投稿内容
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-02 19:14
引用:

例えばミケが犬のリストに含まれるのは間違いなわけですから、現在参照しているレコードの種別(犬とか猫とか)と、挿入しようとしているリストの種別の判別が間違っていることになりますね。



はい、実際問題としてリストを判別する基準が曖昧になってる気がします。
現在、横一行づつ走査していって、前の値と現在の値が異なる場合にaddするようにしています。
※ArrayList.contens()がtrueを返すために使用していない。
  →犬も猫も同様にtrueを返す?
ただ、今は 動物→犬→ポチ の順にインスタンス化し、動物内のリストに犬を、犬内のリストにポチを格納しようとしているのですが、次回タロを生成した時にこの 動物→犬→○ に挿入できなくなっています。(-_-;)
要するに、ネストした孫のリストに追加する方法を知らないのかと思います。

もう彼是3日ほどハマッてます。


[ メッセージ編集済み 編集者: NV 編集日時 2006-03-02 19:19 ]
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-02 19:52
補足です。
処理フローは、下記のように考えています。

while(rset.next()){
 1.生物ArrayList生成
 2.動物インスタンス生成
 3.生物ArrayList.add(動物インスタンス)
 
 4.種類ArrayList生成
 5.犬インスタンス生成
 6.種類ArrayList.add(犬インスタンス)
 
 7.名前ArrayList生成
 8.ポチインスタンス生成
 9.名前ArrayList.add(ポチインスタンス)

 この後が続きません。
}



[ メッセージ編集済み 編集者: NV 編集日時 2006-03-02 19:55 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-03 03:32
毎回 ArrayList を生成する必要はないですね。
まず既存のリストに目的の種類のリストが存在するかどうかを確認して、存在しない場合だけ生成する必要があるのではないでしょうか。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-03 03:47
ちょっと触ってみる限り contains は期待通り動作しますね。
コード:
public class Test {
  public static void main(String[] args) throws Exception{
    List list = new ArrayList();
    list.add("ポチ");
    System.out.println(list.contains("タマ"));
    list.add("タマ");
    System.out.println(list.contains("タマ"));
  }
}



>java Test
false
true


親のリストは Map で管理すると良いかもしれません。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-03-03 08:58
重複を外した状態で DB から持ってくる、というのはダメなんですかね。

アルゴリズムの問題だとおもうので、会社の同僚なり、くまの人形なりに
話しかけながら一度整理する事をおすすめします。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-03 09:15
>>毎回 ArrayList を生成する必要はないですね

やはり、そうですか?
固定観念にハマって難しく考え過ぎてしまっているようです。


>>会社の同僚なり、くまの人形なりに
>>話しかけながら一度整理する事をおすすめします。

いろんな状況で身近に頼れる人がいない環境なのです。
アルゴリズムの問題は質問もしにくいです。


ちなみに、下記のような形で判定してました。これだと同じオブジェクトを参照しているので、間違いですね。
これではdogsの中身だけ変えているだけなのかな?
------------------------------------------------------------
 public static void main(String[] args) {
   String[] arr = {"ポチ1","ポチ2","ポチ3","タマ"};
   ArrayList dogs = new ArrayList();
   Dog dog = new Dog();
   for (int i = 0; i < arr.length; i++) {
     dog.setName(arr[i]);
     System.out.println(arr[i]);
     dogs.add(dog);

     if(dogs.contains(dog)){
       System.out.println(dog.getName() + "は、もういるよ!!");
     }else{
       System.out.println(dog.getName() + "は、まだいないよ!!");
     }
   }
 }
------------------------------------------------------------


[ メッセージ編集済み 編集者: NV 編集日時 2006-03-03 10:49 ]
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-03-03 11:03
こういうツリーのようなデータ構造は「ファイル」と「ディレクトリ」を
イメージしながらやるとわかりやすいのでは?

java.io.FileのAPIが参考になると思います。
(java.io.Fileを使えということではありません)
ゴングラッチェ
常連さん
会議室デビュー日: 2006/03/03
投稿数: 36
投稿日時: 2006-03-03 14:33
はじめまして。ゴングラッチェと申します。
今の方向性からすると「改革断行!!」という内容ですが・・・

引用:

vincentさんより >>
こういうツリーのようなデータ構造は「ファイル」と「ディレクトリ」を
イメージしながらやるとわかりやすいのでは?


わたしもそう思います。
データ構造は、純粋なツリー構造と連結によるリスト構造を組み合わせるのが良いのではないでしょうか。独自実装するのが早道かもしれません。Java APIに純粋なツリー構造や連結リストを見たことがありません。ツリーはSwingでちらっとみましたが。

連結によるリストは、自身の次の要素へのポインタ(参照)を持ち、それぞれのノード(データの塊:インスタンス)をポインタで繋いだものです。ArrayListとは異なります。ArrayListはあくまで配列なので、次の要素を得る時にget(now + 1)といったやり方になると思いますが、連結リストの場合、getNext()といったやり方になります。
「アルゴリズムとデータ構造」系の書籍で解説される「リスト構造」「双方向リスト構造」なんかのイメージです。
ツリーについては、連結リストの拡張版のイメージです。連結リストにgetParent()やgetChildren()、getFirstChild()なんてのをつけるイメージでしょうか。それぞれ、「自身の親を取得」「自身の子供を取得」「自身の子供たちから最初の子供を取得」なんて意味です。
上記のデータ構造についての技術的な話や実装については「デザインパターン」の「Compositeパターン」が参考になると思います。

データ構造の作成は、Map系を活用すると簡潔に作れると思います。これまでの回答者の方々が示されているのとは違った使い方です。
Mapには今まで作成されたツリーのノードのインスタンスが、名前をキーにして登録されているようにします。流れは以下のようになると思います。

1)Mapから「親の名前」をキーにして「親のノードのインスタンスを取得」します。
2)「親のインスタンス」に「子供として自分を追加」します。
3)Mapに「自分の名前」をキーにして「自分のインスタンスを追加」します。

上記が処理の全てではありません。大まかなものです。実際にはそこそこの量のコーディングになると思いますが、作って損はないと思います。
今後どのような使われ方をするかにもよりますが、

引用:

動物--犬--ポチ
  |  +-タロ
  +-猫--ミケ


というデータ構造にしたいのであれば、配列による実装より自然で適していると思います。データ自身が親子関係を司るようなツリーのつくり方をするため、処理自体はシンプルでバグが発生しずらいのではないでしょうか。ArrayListはどうしても配列の要素数やインデックスを意識せざるをえません。その処理を間違えると即バグになります。プログラムが親子関係を司るので、わたしだったら多少時間かけても上記のやり方をします。

スキルアップ/キャリアアップ(JOB@IT)