集合的成员?

发布于 2024-10-20 07:45:44 字数 1131 浏览 2 评论 0 原文

我有两个课程,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
        }

    }
}

I have two classes, Foo and Bar. Each Foo has a name and a bunch of items. Bar contains a bunch of Foo's, each with a unique name.

Bar has a method, AddEntry that takes a fooName and an item (1) if a foo with fooName is already in the Bar, adds another item to the Foo or (2) if a foo with fooName is not in the Bar, creates a Foo with that name and add the item to the new Foo.

This is an outline of how I'm implementing. Is there a better way? I'm just learning Java, but this seems clunky

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

冷情 2024-10-27 07:45:44

我将使用 Map 将 foo 名称映射到 foo 对象。

Map<String, Foo> fooMap = new HashMap<String, Foo>();

这样你就可以做

Foo foo = fooMap.get(fooName);
if( foo == null)
{
  foo = new Foo(fooName);
  fooMap.put(fooName, foo);
}
foo.AddtoFoo(item); 

I'd use a Map<String, Foo> to map the foo name to a foo object.

Map<String, Foo> fooMap = new HashMap<String, Foo>();

Thus you could do

Foo foo = fooMap.get(fooName);
if( foo == null)
{
  foo = new Foo(fooName);
  fooMap.put(fooName, foo);
}
foo.AddtoFoo(item); 
莫多说 2024-10-27 07:45:44

在 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.

傲影 2024-10-27 07:45:44

如果 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.

不交电费瞎发啥光 2024-10-27 07:45:44

您可能想使用 Map 来代替,您可以通过键查找对象。

Map<String,Foo> fooMap = new HashMap<String,Foo>();
foo.put("name_of_foo",new Foo());

那么您的 addEntry 可能如下所示:

void addEntry(String fooName, Object item){
    Foo foo = fooMap.get(fooName);
    if(foo == null){
       foo = new Foo();
       fooMap.put(fooName,foo);
    }
    foo.addToFoo(item);
}

另外,您应该使用 foo.name.equals(fooName) 比较 String 相等性

You probably want to use a Map instead, which you can look up an object by a key.

Map<String,Foo> fooMap = new HashMap<String,Foo>();
foo.put("name_of_foo",new Foo());

Then your addEntry might look like this:

void addEntry(String fooName, Object item){
    Foo foo = fooMap.get(fooName);
    if(foo == null){
       foo = new Foo();
       fooMap.put(fooName,foo);
    }
    foo.addToFoo(item);
}

Also, you should compare String equality by using foo.name.equals(fooName)

余厌 2024-10-27 07:45:44

您可以尝试在 Bar 中使用 HashMap,而不是使用 List。使用 fooName 作为唯一键。这样,在 Bar 中,您可以更快地检查当前 bar 中是否已经知道 Foo 的实例(只是类似这样的事情):

Map<String, Foo> fooMap = new HashMap<String, Foo>();

... 
Foo foo = fooMap.get(fooName);
if(foo == null)
{
   fooMap.add(fooName, new Foo(fooName));
}

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):

Map<String, Foo> fooMap = new HashMap<String, Foo>();

... 
Foo foo = fooMap.get(fooName);
if(foo == null)
{
   fooMap.add(fooName, new Foo(fooName));
}
怀里藏娇 2024-10-27 07:45:44

除非 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.

半﹌身腐败 2024-10-27 07:45:44

这是正确的,但如果您正在寻找正确的 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 a Map, like the HashMap. Use as key the fooName and as value the Foo object. Get the object you are looking with get(fooName)and if returns null, does not exists and the add a new Foo with put().

多彩岁月 2024-10-27 07:45:44

最好的方法和更可维护的方法是使用 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文