2016-04-28 12 views
1

Java教育を継続するために、配列のArrayListに文字列値をすばやく効率的に検索できるネイティブJavaメソッドがあるかどうかを判断しようとしています。ここでArray値のArrayList逆引き参照

は私がやろうとしているかを示して私のコードです:

public void exampleArrayListofArray() { 
     ArrayList<String []> al = new ArrayList<>(); 
     al.add(new String[] {"AB","YZ"}); 
     al.add(new String[] {"CD","WX"}); 
     al.add(new String[] {"EF","UV"}); 
     al.add(new String[] {"GH","ST"}); 
     al.add(new String[] {"IJ","QR"}); 
     al.add(new String[] {"KL","OP"}); 
     displayArrayListofArray(al); 
    } 

    public void displayArrayListofArray(List<String []> al) { 

     for (String [] row : al) 
      for (int column = 0; column <= 1 ; column ++){ 
       System.out.println("Value at Index Row " + al.indexOf(row) + 
         " Column " + column + " is " + (row)[column]); 
      } 

     String lookUpString = "YZ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "ST"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "IJ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "AA"; 
     lookUpMethod(al, lookUpString); 
    } 

    public void lookUpMethod(List<String []> al, String lookUpString) { 
     boolean isStringFound = false; 
     for (String[] row : al) { 
      for (int column = 0; column <= 1; column++) { 
       if (al.get(al.indexOf(row))[column] == lookUpString) { 
        System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column); 
        isStringFound = true; 
       } 
      } 
     } 
     if (!isStringFound) { 
      System.out.println("Search string '" + lookUpString + "' does not exist."); 
     } 
    } 

これは、指定された文字列のための私のArrayListを検索する最も効率的な方法ですか? (ArrayListを使用しないで)コードをより効率的にするために何かすべきことはありますか?

おそらく私がここでやろうとしていることは、HashMapなどのArrayListより効率的な方法があるかもしれないが、現在は非常に限られたJavaの知識があることを知っています。 HashMapを使用して最初から開始する必要があります。

  1. ユーザが入力した値
  2. ためのArrayListのは内の隣接値でいくつかのCALCSを行い検索ArrayListの
  3. をロードするために、資産のテキストファイルを読む:私のコードの最後の目標は、次のことを行うことです検索行
  4. は、ユーザーが検索行
  5. の近隣値が検索文字列が
  6. が戻っアル中、資産のテキストファイルに変更を保存見つからない場合、ユーザーは新しい行を追加することを許可更新を許可しますphabeticalため

エアフィックス

+0

任意の 'Collection'の要素を参照するネイティブな方法がありますが、この場合、指定されたコレクション内のすべての配列を調べているので、ネイティブな方法はありません。より合理的で簡潔で宣言的なアルゴリズムのためには、Java 8 lambdaを使用することをお勧めします。 – Mena

+0

以前にコレクションをソートしておけば、O(n)ではなくO(log n)で実行されるバイナリ検索を適用できます。また、他のすべての残りのリストと配列を実行する代わりに1つの一致が見つかった場合は、検索メソッドから戻ることができます。 – Palle

+3

また、私はバグを発見したかもしれません:文字列の一致をチェックする場合は、 'firstString.equals(secondString)'メソッドを使用する必要があります。 '==' -Operatorは、両方のString参照がメモリ内の全く同じ場所を指している場合にのみtrueを返します。 – Palle

答えて

1

私の答えは次のとおりです。心配しないでください。

私はあなたが間違った角度から見ていると思います。アプリケーションのユーザーに「パフォーマンス」問題があることがわかった場合、プロファイリングすると、現在の「検索」コードが「犯人」(「エンドユーザーが知覚するパフォーマンス」を殺す単一のホットスポット)であることが示されます。あなたは弾丸を噛んでArrayListsとは異なるデータ構造を使うことを学ばなければならないでしょう。 (実際には、Set/HashSetはあまり「異ならない」;それらを使用する方法を学ぶことは、それが聞こえるほど大きな取引ではない)。

しかし、上記の「質問」のいずれかに「いいえ」と答えた場合(パフォーマンスが悪いと不平を言うユーザーがいないなど)、パフォーマンスについて心配する必要はありません。

短いストーリー:どちらの演奏も本当に問題です。それで解決しなければなりません。そうでなければ:壊れていないものを修正しようとしないでください。

(言い換えれば、学習の観点からは、コードを保存し、セットを使用する新しいバージョンを開始することをおすすめします)知っておくべきことをすべて説明するチュートリアルがたくさんあります。

しかし、ちょうどあなたにある方向を伝えてください:あなたの主な「パフォーマンス」のキラーは、あなたが思ったように、データ構造の不適切な使用です。検索する文字列の配列を格納するためにArrayListを使用する利点はありません。それは "2つの層"を追加します。それぞれのコードでこれらの「リスト」を順番に繰り返す必要があります。代わりに(HashSetのような)単一のSetを使用する場合は、あなたのすべての "検索文字列"をそのセットに追加すると、マッチのためのあなたの全体的な "検索"は、 "この値を含んでいますか?"

+0

「私のJava教育を続けたいと思っています」彼は今それについて心配していると思うので、問題が発生しました –

+0

ユーザーからのパフォーマンスのヒットはありません(最初は私のみ)。最後のArrayListの長さは100〜150行です。しかし、私は今すぐ最小限の時間投資で実行可能なソリューションを取得しようとしています。その後、改訂プロセスを通して、私のJavaの知識が成長するにつれて、すべてを強化したいと思っています。私は今それについて考えているので、今後の改善のために何を勉強するかを知っています。あなたは価値のあるハッシュセットのチュートリアルの指示に私を向けることができますか? – Airfix

+0

@Airfixサイドノート:「知覚されるパフォーマンス」は、2つの端から来ています。あなたのデータのサイズから。だからおそらく150の検索パターン。ファイルの行数はいくつですか?あなたが<100000について話しているのなら...おそらくまだ大きな問題はない。しかし、あなたのファイルが**大** **の場合... O(n * n)とO(1)の違いをすばやく知ることができます。 (私がそこに意味するものを理解するための大きな表記法の検索) – GhostCat

関連する問題