1

我有一个对象的 ArrayList 如下:

目的:

String country;
String languages;
String number;

名单如下:

India, Hindi, 500
India, English, 600
India, Bengali, 800
US, French, 700
Germany, German, 800

上面的列表在我的代码中显示为:

List<MyObject> myList;  // this is the list I want to query

因此,myList 中有 5 个 MyObject 对象,其值如前所述。

在我的情况下,对象的语言和国家属性是唯一的键。

所以我想根据语言和国家来获取对应的数字。

例如:

getNumber(India, Hindi) should return 500
getNumber(India, Bengali) should return 800

如何以这种方式查询列表?是否可以通过 Iterator ?

谢谢阅读。

4

6 回答 6

3

在我的情况下,对象的语言和国家属性是唯一的键。

听起来您很可能应该使用地图然后...

如何以这种方式查询列表?是否可以通过 Iterator ?

绝对 - 这将是 O(N) 但它很容易做到:

// TODO: Revisit the decision to make a field called "number"
// a string...
String getNumber(String language, String country) {
    for (MyObject candidate : list) {
        if (candidate.getLanguage().equals(language) &&
            candidate.getCountry().equals(country)) {
            return candidate.getNumber();
        }
    }
    // Or throw an exception, depending on what semantics are expected
    return null;
}
于 2012-08-02T09:59:56.390 回答
2

使用列表的唯一方法是遍历所有对象并找到具有给定国家和语言的对象。

MyKey如果您创建一个包含国家和语言并覆盖equals()hashCode()基于这两个字段的类,则效率会更高。然后,您可以使用 a HashMap<MyKey, MyObject>,并通过调用以恒定时间获取对象:

MyObject o = map.get(new MyKey(country, language));
于 2012-08-02T10:00:40.797 回答
1
public int getCodeByCountryAndLanguage(String country, String language){
    for(MyObject candidate : mylist){
        if(candidate.country.equals(country) 
           && candidate.language.equals(language)){
            return candidate.number; 
        }
    }
    return -1;
}
于 2012-08-02T10:01:16.843 回答
1

像这样的东西:

int getNumber(country, language) {
    int number = -1;
    for(MyObject obj : myList) {
        if(country.equals(obj.country) && language.equals(obj.country)) {
            value = obj.number;
            break;
        }
    }
    return number;
}
于 2012-08-02T10:01:43.090 回答
0

是的,可以使用迭代器来做到这一点。它大致看起来像这样:

for(MyObject m : myList) {
    if (   "India".equals(m.getCountry())
        && "Hindi".equals(m.getLanguages())) {

        return m.getNumber();
    }
}

但是,您也可以考虑将countryandlanguage字段移动到一个单独的类,例如MyListKey,具有正确的equals()andhashCode()方法,然后使用Map<MyListKey, String>. 您的代码将是:

return myMap.get(new MyListKey("India", "Hindi"));
于 2012-08-02T10:01:12.490 回答
0

如果对象的顺序不是问题,则应更改为使用 Map。

您可以使用迭代器并比较输入值来查找结果

如果您可能想要排序,请考虑使用集合。MyObject 应该扩展 Comparable

于 2012-08-02T10:10:50.433 回答