3

従業員情報であるオブジェクト コレクションから値を抽出するメソッドがあります。

public class Employee
{
    public String AREA;
    public String EMPLOYEE_ID;
    public String EMPLOYEE_NAME;
}

ArrayListに値が含まれているかどうかを確認するだけで、ArrayListに値が含まれているかどうかを確認し、追加しない場合は、完了するまでに187msかかります。

    long startTime = System.currentTimeMillis();
    ArrayList<String> distinct_areas = new ArrayList<String>();
    for (int i = 0; i < this.employeeTress.length; i++)
    {
        if (!distinct_areas.contains(this.employeeTress[i].AREA))
            distinct_areas.add(this.employeeTress[i].AREA);
    }
    String[] unique = new String[distinct_areas.size()];
    distinct_areas.toArray(unique);
    long endTime = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime - startTime) + "ms");

それから私はそれが速くなるかどうかを確認するためにそれを別の方法で行うことを考えました。配列をソートし、最後の項目のみが異なる場合はチェックしてから追加します。完了するまでに121ミリ秒かかります。

    startTime = System.currentTimeMillis();
    String[] vs = new String[this.employeeTress.length];
    for (int i = 0; i < this.employeeTress.length; i++)
    {
        vs[i] = this.employeeTress[i].AREA;
    }
    Arrays.sort(vs);
    ArrayList<String> vsunique = new ArrayList<String>();
    vsunique.add(vs[0]);
    for (int i = 0; i < vs.length; i++)
    {
        if (!vsunique.get(vsunique.size()-1).equals(vs[i]))
        {
            vsunique.add(vs[i]);
        }
    }
    String[] uni = new String[vsunique.size()];
    vsunique.toArray(uni);
    endTime = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime - startTime) + "ms");

私はJavaが初めてなので、これを行うためのより良い方法を知りたいです。*注意: このコードは Android ジンジャーブレッド API LVL 10 で動作するはずです。

4

4 に答える 4

2

すべての従業員を に挿入しHashSetます。の定義からSet、それらはすべて一意になります。

Set<Employee> unique = new HashSet<Employee>(Arrays.asList(employeeTress));
// unique.toArray() if needed

Employeeオブジェクトが同じである場合にそれらが等しいと見なされるようにする場合は、クラスでメソッドを適切にオーバーライドAREAする必要があります。equals()Employee

于 2013-07-31T14:29:35.437 に答える
2

他の人がすでに述べているように、これを行うために a を使用できますが、Setアイテムが同じであるときにアイテムが等しいと見なされるようにする場合は、オブジェクトのメソッドAREAをオーバーライドして、それに基づいて他のアイテムと比較する必要があります。変数。equalsEmployee

equals メソッドをオーバーライドする前に、いくつかのことを知っておく必要があります。ここでそれについての議論があります: JavaでequalsとhashCodeをオーバーライドするときに考慮すべき問題は何ですか?

于 2013-07-31T14:31:48.653 に答える
1

HashSet を使用するだけで、 HashSet に一意の要素のみが追加されます。

objectOfHashSet.add(Object)HashSetの関数はtrue on successful、オブジェクトの追加を返します。

Set<Employee> hs = new HashSet<Employee>();

    if(!hs.add(i2)){
      // do some operation here
    }

hereもオーバーライドする必要がありますequals method

public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof Employee))
            return false;

        // HERE PERFORM YOUR CHECK
        if("Employee.NAME".isequals(obj.NAME))
        {return true;}
    }

またhashCode() of the key objects、オブジェクトがコレクション内にある間は、コレクションに入れる が変更されないようにしてください。これを確実にする最善の方法は、keys immutable.

于 2013-07-31T14:28:31.233 に答える