12

この質問の言い方がよくわかりません。カスタムJavaクラスの特定の部分をチェックして、特定の基準に一致するかどうかを確認する方法があるかどうか疑問に思っています. このような

public Name(String forename, String middlename, String surname)

そして、そのクラスのインスタンスの配列が作成されると、

Name[] applicants = new Name[4];

applicants[0] = new Name("john","bob", "rush");
applicants[1] = new Name("joe","bob", "rushden");
applicants[2] = new Name("jack","bob", "rushden");
applicants[3] = new Name("jake","bob", "rushden");

を持つ人のクラスのインスタンスを検索することは可能ですか?

midddlename.equals("bob") && surname.equals("rush")

if(surname.equals("bob")) then elseなどのソリューションを実際に探しているわけではありません

しかし、配列をすばやく検索できる組み込みのJavaクラスです。この速度は非常に重要です。

4

7 に答える 7

1

配列を検索することと「速度が非常に重要」ということは、実際には両立しません。配列が非常に小さい場合を除き、配列の検索は決して迅速ではありません。これは、データベースの全テーブル スキャンに相当し、どのように処理してもパフォーマンスは低下します。物事をすばやく見つけるための鍵は、インデックス構造を使用することです。絶対に必要な場合は配列を使用できますが、検索は別のデータ構造を使用して行う必要があります。ハッシュまたはツリー ベースのコレクションをチェックしてください。取得が非常に高速になるようにデータが整理されているためです。TreeSet、TreeMap、HashSet、HashMap など。ハッシュ化されたキーのインデックス データをハッシュします。ツリーは似ていますが、データをソートされた順序で格納します。

于 2010-02-25T20:58:00.803 に答える
0

Apache Derbyhsqldbなどのメモリ内データベースを使用します。JDBC、JPA、または Hibernate を利用して、必要なことをすべて行うことができます。

コードをプロファイリングします。次に最適化します。

于 2010-02-25T20:50:24.783 に答える
0

私が考えることができるより速い方法は、このオブジェクトのプロパティ値をミラーリングし、各値の内部インデックスを保持するデータ構造を作成することです。

値が検索されると、この内部データ構造はバイナリ検索を使用してインデックスを返します。

唯一の要件は、オブジェクトがこの構造を登録および更新する必要があることです。

次の架空の UML/Python のようなコードのようなもの:

 // Holds the index number of a given value
 // for instance, name="Oscar" may be at index 42...
 IndexValuePair
     index : Int
     value : String 

     +_ new( value: String, index: Int ) 
          return IndexValuePair( value, index )

 ValuePairComparator --> Comparator 

     + compareTo( a: IndexValuePair, b: IndexValuePair ) : Int 

         return a.value.compareTo( b.value )

 SearchStructure
     - data = Object[] // The original array which contains your applicants
      // a list of arrays each one containing the property value, and the index on "data" where that value appears 
     - dataIndexes =  List(IndexValuePair)[String] // Map<List<IndexValuePair>> 
     - dataIndexexInitialized = false

     // Add an object to this structure
     + addObject( o: Object ) 
          if( ! dataIndexesInitialized, 
              initIndexesWith( o )
          )

          index = data.add( o ) // returns the index at which "o" was inserted
          addToIndexes( o, index ) 

     // Register all the properties values of the given object 
     // along with the index where they appear in the original array 
     - addToIndexes( object: Object, index: Int ) 
           forEach( property in Object , 
              list = dataIndexes[property]
              list.add( IndexValuePair.new( property.value, index ) ) 
           )
     // Create empty array for each property .. 
     - initIndexesWith( object : Object ) 
          forEach( property in object , 
                comparator = ValuePairComparator()
                list = List<IndexValuePair>()
                list.setComparator(  ) 
                dataIndexes[property] =  list
          )
          dataIndexesInitialized = true 


     // Search an object using the given criteria ( a Map<String, String> = key=value ) 
     + search( criteria: String[String] ) : List<Object>

        result = Set<Object>()

        // let's say criteria has:
        // ["name":"Oscar", "lastName"="Reyes"]
       forEach( key in criteria, 
            list = dataIndexes[key]  // "name", "lastname" ..etc. 
            valuePair = list.binarySearch( criteria[key] ) // first Oscar, later Reyes 
            result.add( data[valuePair.index] )
       ) 

       return result

おっとっと

これが理解できることを願っています。

ポイントは、これを本当に高速にするには、プロパティごとにインデックスを保持する必要があるということです

  1. データの配列
  2. 各プロパティの配列。これにはデータのインデックスが含まれます。

たとえば、次の配列がある場合:

 a = [ Object(name="Mike", lastName="Z" )
       Object(name="Oscar", lastName="Reyes" ) , 
       Object(name="Rahul", lastName="G" ) , 
       Object(name="Pie", lastName="154" )  ]

彼らはポジションを持っています:

0 = Mike ... 
1 = Oscar ...
2 = Rahul ...
3 = Pie ...

そして、2 つ (この場合) の別々の配列があり、並べ替えた後は次のようになります。

nameArray =  ["Mike=0", "Oscar=1", "Pie=3", "Rahul=2"]

lastNameArray =   ["154=3", "G=2", "Reyes=1", "Z=0"]

特定の属性を検索するときは、対応する配列を取得します。たとえば、姓「Reyes」を検索する場合は、「lastName」配列を取得します

 ["154=3", "G=2", "Reyes=1", "Z=0"]

そして、位置 2 の要素を返す "Reyes" に対して binarySearch を実行し、元の配列での "Oscar" の位置である index = 1 を返します。

これにより、O(log n)以下に保つ必要があります

于 2010-02-27T01:19:54.887 に答える
0

ParallelArray クラスを見てください。これは要件を満たしていますが、効率的に使用するには関数型プログラミングの概念を少し学ぶ必要があります。

このクラスは JDK 6 に付属していませんが、JDK 7 に付属している可能性があります (議論中)。その間、ライブラリとして使用できます - http://gee.cs.oswego.edu/dl/concurrency-interest/から JSR166y パッケージをダウンロードしてください。

詳細な説明については、このチュートリアルを参照してください: http://www.ibm.com/developerworks/java/library/j-jtp03048.html

複雑に聞こえるかもしれませんが、そうです (高性能なマルチスレッド アルゴリズムを掘り下げているだけの場合)。より使いやすい API を Parallel Arrayにラップしようとする Groovy プロジェクトがあります。 .org/パラレライザー

于 2010-02-27T02:17:42.503 に答える
0

object equality over array check に基づいて検索する必要がある場合はapache common ArrayUtils、基本的に name オブジェクトの equals と hascode をオーバーライドして使用する必要がありますが、カスタム検索条件を使用する場合は、独自の方法を実装する必要があると思います。組み込みのJava言語サポートはありません

于 2010-02-25T17:31:09.063 に答える