集合的成员?
我有两个课程,Foo 和 Bar。每个 Foo 都有一个名称和一堆项目。 Bar 包含一堆 Foo,每个 Foo 都有一个唯一的名称。
Bar 有一个方法 AddEntry,它接受 fooName 和一个项目 (1) 如果具有 fooName 的 foo 已在 Bar 中,则将另一个项目添加到 Foo 中;或者 (2) 如果具有 fooName 的 foo 不在 Bar 中,则创建一个使用该名称的 Foo 并将该项目添加到新的 Foo 中。
这是我如何实施的概述。有更好的办法吗?我刚刚学习 Java,但这看起来很笨拙
class Foo { // a name and some items
String fooName;
List<Object> items = new ArrayList<Object>;
Foo(name) {...} // create a named Foo
AddtoFoo(item) {...} // add an item to this Foo
}
class Bar { // a bunch of foo's
List<Foo> fooList = new Arraylist<Foo>;
void AddEntry(String fooName, Object item) {
boolean member = false;
for(Foo foo : fooList){
if{foo.name == fooName) {
member = true;
foo.AddtoFoo(item); // adds an item to this foo
break;
}
}
if(member == false) {
Foo foo = new Foo(fooName); // creates a named foo
foo.AddtoFoo(item); // adds the item
fooList.add(foo); // maintain our list of foo's
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我将使用
Map
将 foo 名称映射到 foo 对象。这样你就可以做
I'd use a
Map<String, Foo>
to map the foo name to a foo object.Thus you could do
在 bar 类中,您应该使用 HashMap 而不是 ArrayList,其中 FooName 作为键,Foo 作为对。由于 HashMap 有 o(1) 搜索时间,因此您可以在 arraylist 中使用 for 循环进行迭代。
In bar class you should use HashMap instead of ArrayList with FooName as key and Foo as pair. Since HashMap has o(1) searchingtime which you are doing with a for loop itreation in arraylist.
如果 foo 的名称只是用于查找,也许
Map>
(并删除 Foo.name)可以让您免于编写那么多代码。If foo's name is just there for the lookup, perhaps a
Map<String,List<Foo>>
(and removing Foo.name) would save you from coding that much.您可能想使用
Map
来代替,您可以通过键查找对象。那么您的
addEntry
可能如下所示:另外,您应该使用
foo.name.equals(fooName)
比较String
相等性You probably want to use a
Map
instead, which you can look up an object by a key.Then your
addEntry
might look like this:Also, you should compare
String
equality by usingfoo.name.equals(fooName)
您可以尝试在 Bar 中使用 HashMap,而不是使用 List。使用 fooName 作为唯一键。这样,在 Bar 中,您可以更快地检查当前 bar 中是否已经知道 Foo 的实例(只是类似这样的事情):
You could try using a HashMap in Bar, instead of using a List. Use the fooName as unique key. This way, in Bar you can check if the instance of Foo is already known in your current bar much faster (just something along the lines of this):
除非 foo 必须保持相同的顺序,否则您可以用
Map
替换 foo 列表。搜索现有的 foo 将成为 O(1) 操作而不是 O(n) 操作。即使 foo 必须保持有序,您也可以使用 LinkedHashMap。
Unless the foo must stay in the same order, you could replace your list of foos with a
Map<String, Foo>
. Searching for an existing foo would become a O(1) operation rather than a O(n) operation.Even if the foos must stay ordered, you could use a LinkedHashMap.
这是正确的,但如果您正在寻找正确的 foo 对象,请使用
Map
,而不是使用List
,例如HashMap
。使用fooName
作为键,使用Foo
对象作为值。使用get(fooName)
获取您正在查找的对象,如果返回 null,则不存在,然后使用put()
添加一个新的Foo
。This is correct but if your are looking for the right foo object, instead of using a
List
, use aMap
, like theHashMap
. Use as key thefooName
and as value theFoo
object. Get the object you are looking withget(fooName)
and if returns null, does not exists and the add a newFoo
withput()
.最好的方法和更可维护的方法是使用 hashCode 和使用 contains。
公共 int hashCode() {
返回 fooName.hashCode();
这
必须比 for: 循环更快。虽然它没有为您提供 O(1) 复杂性,但它保证(理论上)固定检索 ~ O(1)
另外 get() 方法在 hashMap 上执行相同的操作。它使用 hashCode 从 Map 中检索对象。
The best way and more maintainable way would be to use hashCode and use contains.
public int hashCode() {
return fooName.hashCode();
}
This is must faster than for: loop. Althought it doesn't provide you O(1) complexity but it guarantees (theoretically) fixed retrieval ~ O(1)
Also get() method does the same on hashMap. It uses hashCode to retrieve the object from the Map.