2017-09-19 8 views
4

で部分オブジェクトを比較してください。新しいレコードを挿入するときに、リストに既に同じタイトルと日付のオブジェクトが含まれているかどうかをチェックし、その中の時間を置き換える必要があります。は、次のように私は、オブジェクトを持っているのArrayListのJava

私はO(1)時間を達成できる解決策を探しています。

+0

、あなたのオブジェクトを格納するためのデータ構造を使用していますか?私は、時間の複雑さをO(1)で検索しているHashSetに行きます –

+0

私はキーとして日付を持つHas​​hMapと値としてオブジェクトのリストを使用しています。 HashMapからオブジェクトのリストを取得したら、上記の操作を実行する必要があります。 –

+0

あなたのIDフィールドで比較してみませんか?それが他のオブジェクトに存在する可能性がある場合、IDを持つことにはあまり意味がありません。反対に、同じタイトルと日付を持つ2つのオブジェクトを持つ可能性はさまざまです。また、これを返す必要はあまりありません。コンストラクタでは、Javaではコンストラクタがすでに新しいオブジェクトインスタンスを返しています。 –

答えて

3

ArrayListで既存の要素を検索すると、ソートされたArrayListの場合はO(n)になります(レコードをソートするなど).O(logn)時間が必要です。したがって、目的の機能を達成するためには、Map構造体を使用し、タイトルと日付でインデックスを作成します。このような何か:私はMap<String, Map<Date, Record>>は少し派手か奇妙に見えるかもしれないことに同意するだろうとしながら、地図の地図を使用し

// Create general records DB 
Map<String, Map<Date, Record>> records = new HashMap<>(); 

// Create sub DB for records with same ID 
Map<Date, Record> subRecords = new HashMap<>(); 

// Assuming you've got from somewhere id, title and rest of the parameters 
subRecords.put(recordDate, new Record(id, title, time, duration)); 
records.put(recordId, subRecords) 

// Now checking and updating records as simple as 
sub = records.get(someTitle); // Assuming you've got someTitle 
if (sub != null) { 
    record = sub.get(someDate); // Same for someDate 
    if (record != null) { 
     record.updateTime(newTime); 
    } 
} 

は、あなたからのequalsとhashCodeメソッドをオーバーライドする必要性を防ぐことができます。あなたはO(1)時間内にレコードを更新したり、存在を確認する能力を提供します。さらに、存在または更新をチェックするためのレコードを作成する必要がないということは、タイトルと日付を直接使用して必要なものを取得できることです。

0

あなたはとHashSet

によって

@Override 
    public boolean equals(Object obj) { 
     if(this == obj) return true; 
     if(!(obj instanceof Record)) return false; 
     Record otherRecord = (Record)obj; 
     return (this.time.equals(otherRecord.time) && this.title.equals(otherRecord.title)); 
    } 

    @Override 
    public int hashCode() {   
     int result = titile != null ? titile.hashCode() : 0; 
     result = 31 * result + (time != null ? time.hashCode() : 0); 
     return result; 

    } 

を実装して、あなたが欲しいリストにHashSetのを変換することができ

HashSet hset = new HashSet<Record>(); 
    if(!hset.add(record)){ 
     hset.remove(record); 
     hset.add(record); 
    } 

を挿入するためのHashSetを使用することを行うことができます。

+2

'String'sと' == 'を比較しないでください! –

+1

このリストを維持し、その間にレコードを更新できるようにする必要があると私は理解しています。したがって、HashSetとListを切り替えることは、O(1)要件を考慮した実際のオプションではありません。 Isは常にHashSetまたはMapでなければなりません。 –

+1

同じことが起こります。 – Oleg

0

またはConcurrentHashMapのようなO(1)アクセスを提供するマップ実装を利用してください。

擬コード:

class Record { 
    static class Key { 
     Date date 
     String title 
     // proper hashCode and equals 
    } 
    Date date 
    String title 
    int id 
    Time time 
    Key getKey() {...} 
} 


Map<Record.Key, Record> recordMap = new HashMap<>(); 
for (record : records) { 
    recordMap.merge(record.getKey(), record, 
        (oldRecord, newRecord) -> oldRecord.setTime(newRecord.getTime())); 
} 
関連する問題