2016-10-26 4 views
0

)とラベル付けしました。私は簡単な問題があります。私は100000の名前でArrayList(型Stringの)を持っています。私は別のArrayList(Integer型の)を作成して100,000個のElementsを持ち、String ArrayListの各要素にID番号を割り当てたいと思います。等しい名前には同じID番号を割り当てる必要があります。
非常に基本的な例:
私が持っている:(ハンス、最大、ハンス、ハンス・フランク)
私がしたい:(1、2、1、1、3)Arraylistの固有値をラベル<String>(識別子が

私は機能するソリューションを実装しているが、非常に遅い(私の100,000名の大きなデータセットのために)。私は誰かがこれを行うより良い/より速い方法を見つけることができるのだろうか。みんなに感謝します。

public static void main(String[] args) {   

    // initialize arraylists 
    ArrayList<String> Names  = new ArrayList<String>(); 
    ArrayList<Integer> Id   = new ArrayList<Integer>(); 

    // sample data    // I want the integer Arraylist to have values: 
    Names.add("Hans");   // 1 
    Names.add("Max");   // 2 
    Names.add("Hans");   // 1 
    Names.add("Hans");   // 1 
    Names.add("Frank");   // 3 

    // my solution (works, but is slow and confusing) 
    int N = Names.size(); 
    int ID_Count = 0; 
    for (int i=0; i<N; i++) { 
     boolean match_found = false; 
     String curr_Name = Names.get(i); 
     for (int check=0; check<i; check++) { 
      if (curr_Name.equals(Names.get(check))) { 
       Id.add(Id.get(check)); 
       match_found = true; 
       break; 
      } 
     } 
     if (match_found==false) { 
      ID_Count++; 
      Id.add(ID_Count); 
     } 
    } 

    // show result 
    for (int i=0; i<N; i++) { 
     System.out.println(Id.get(i) + " " + Names.get(i)); 
    } 
} 
+2

私はそれが動作するにもかかわらず、あなたのアプローチを示唆してwouldntは。 HashMaps を試してみましたが、同じ値を持つ必要がある同じキーと同じように動作します –

+0

[indexOf()](https://docs.oracle.com/javase/) 8/docs/api/java/util/List.html#indexOf-java.lang.Object-)メソッド?これはあなたのIDリストに追加するときにあなたを助けるかもしれない – Ash

+0

しかし、助けてくれてありがとう。 HashMapsを使ったことはありません。サンプルコードのためにHashMapsで回答を投稿できるのであれば、とても感謝しています! – thomas

答えて

0

これはそれを行うためのより高速な方法です:

public static void main(String[] args) { 

    // initialize arraylists 
    ArrayList<String> Names  = new ArrayList<String>(); 
    Map<String,Integer> map  = new HashMap<>(); 

    // sample data    // I want the integer Arraylist to have values: 
    Names.add("Hans");   // 1 
    Names.add("Max");   // 2 
    Names.add("Hans");   // 1 
    Names.add("Hans");   // 1 
    Names.add("Frank");   // 3 

    int N = Names.size(); 

    int id = 0; 
    for (int i = 0; i < N; i++) { 
     String name = Names.get(i); 
     if (map.get(name) == null) { 
      map.put(name,++id); 
     } 
    } 

    // show result 
    for (int i=0; i<N; i++) { 
     String name = Names.get(i); 
     System.out.println(map.get(name) + " " +name); 
    } 

} 
+0

素晴らしい、それは私が探していたものでした。 100,000を超える名前の結果がどのようなものであるかを知るために:実行時間は1分2秒から0.6秒に短縮されました!これが信じられない!どうもありがとうございます! – thomas

+0

私はそれがあなたを助けることができてうれしい! –

0

私が正しくあなたの質問を理解していれば、あなたはそれがはるかに高速/簡単に二つの配列を扱うよりもなりますよう、HashMapを使用するべきです。

Map<String,Integer> map = new HashMap<>();

あなたがmap.put("name", int id)を行うことができるようになります。この方法は、それが重複キーを許可しません(キーはあなたのケースでは、「名前」である)ので、あなたは自動的にあります:私はこのようにそれを行うだろう同じ名前のキーと値のペアは1つのみです。

関連する問題