2013-04-06 82 views
0

我已经看了很多地方,大多数数组列表示例使用“String”作为它们的元素,但使用对象的地方很难找到。对象的Java Arraylist包含/等于

比方说,我在一本书收集工作,我有一个作家对象:

class Author { 
    String name; 
    <other data>; 
    int bookCount; 

    public Author(String n) { 
    name = n; 
    } 

    public boolean equals(Author other) { 
    if (other.name.equals(name)) { return true;} 
    return false; 
    } 
} 

所以我创建实例作为ArrayList作者列表:

Arraylist<Author> writers; 

所以我想找出作者是否存在,如果他们不存在或创建一个新条目,或者如果他们这样做,则增加bookCount。我可以写一个等于上作者姓名方法(如上图所示),然后做一些事情,如:

bookAuthor = "James Gosling"; // normally an input 
Author current = new Author(bookAuthor); 
if (!writers.contains(current)) { 
    writers.add(current); 
} else { 
    writers.get(writers.indexOf(current)).bookCount++; 
} 

我相信这会工作,我觉得很反感的是刚刚创造了大量的对象在比较之后将它们扔掉,但是我遇到的问题是Author的正常构造函数并不那么简单,并且涉及数据库查找(如此昂贵)。

这意味着在这种情况下名称唯一的构造函数仍然可以使用,但是然后我需要构造两次作者。我能想到的唯一的另一种方式是创建一个从ArrayList继承并重写Contains和indexOf的新类。这似乎是一个很大的开销,然后我是否需要重写equals或hashCode或新类中的其他东西?

我是否错过了一些东西,有没有提供内联函数或使某些东西容易使用对象容器的方法? 我希望,人们可以这样做:

Arraylist<Author> {equals(String x) { if (x = this.name) { return true;} return false; } writers; 

if (!writers.contains(bookAuthor)) { 
    writers.add(new Author(bookAuthor,dbconn); 
} else { 
    writers.get(writers.indexOf(bookAuthor)).bookCount++; 
} 

当然包含和的indexOf没有特征码,并把内联是几乎相同的工作量,创建新的类,但。

回答

1

Mybe您可以使用Map<String,Author>的名称 - >作者映射,这样会得到它周围

+0

喜欢Author对象你是在暗示并行地图存储或更换名单?据我所知,如果后者我只能为作者提取一个Collection对象。 – user1720253 2013-04-06 15:54:44

0

如果你使用真实世界的数据,名字是一个可怕的选择。你认为有多少约翰史密斯写书?

你需要一个唯一的标识符,自然数据不会削减它,所以人工ID字段是最好的选择。

接下来,您应该覆盖equals()以使用ID。 hashCode()应基于equals()使用的相同字段,因此也应相应地覆盖该字段。

接下来,使用Set而不是List - 设置维护其元素的不相等。不需要检查。

+0

谢谢,但在我的书集(超过3000本书)中,我没有重复作者。尽管如此,查找仍然是一个问题。至于set vs list,我仍然需要知道它是否存在,以查看是否需要添加或更改数据,所以我不认为这是相关的。 – user1720253 2013-04-06 15:48:26

0

我有,在一定程度上,类似的情况在不久前,我就过来了这样的问题:

  1. 分配一个ID,每个作者(或任何唯一标识符)。 搜索的名字是时候所有
  2. 负载消耗后,所有的数据为HashMap<Long, Author>:因为它更快检查HashMap与所有在它的Authors的,不是每次检查数据库。
  3. 在O(1)你可以访问你的hashMap.get(ID)
+0

将数据放入(哈希)映射中会丢失列表的顺序,但否则这是可行的。如果访问是O(1),如果密钥是Long还是String,它真的很重要吗? – user1720253 2013-04-06 16:02:35

+0

一切都有其优点和缺点。不,不管你使用'Long'还是'String'作为地图的关键。 – 2013-04-07 03:59:56