Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代数组列表_Java_List_Collections - Fatal编程技术网

Java 迭代数组列表

Java 迭代数组列表,java,list,collections,Java,List,Collections,我有一个对象的ArrayList,如下所示: India, Hindi, 500 India, English, 600 India, Bengali, 800 US, French, 700 Germany, German, 800 对象: String country; String languages; String number; 名单如下: India, Hindi, 500 India, English, 600 India, Bengali, 800 US, French, 7

我有一个对象的ArrayList,如下所示:

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

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
如何以这种方式查询列表?可以通过迭代器实现吗

谢谢你的阅读

在我的例子中,对象的语言和国家属性是唯一的键

听起来你很可能应该用地图

如何以这种方式查询列表?可以通过迭代器实现吗

绝对-这将是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;
}
在我的例子中,对象的语言和国家属性是唯一的键

听起来你很可能应该用地图

如何以这种方式查询列表?可以通过迭代器实现吗

绝对-这将是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;
}

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

如果创建一个包含国家和语言的
MyKey
类,并基于这两个字段重写
equals()
hashCode()
,效率会更高。然后,您可以使用
HashMap
,通过调用以下命令以固定时间获取对象:

MyObject o = map.get(new MyKey(country, language));

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

如果创建一个包含国家和语言的
MyKey
类,并基于这两个字段重写
equals()
hashCode()
,效率会更高。然后,您可以使用
HashMap
,通过调用以下命令以固定时间获取对象:

MyObject o = map.get(new MyKey(country, language));

是的,可以使用迭代器进行此操作。大致如下所示:

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

        return m.getNumber();
    }
}
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;
}

但是,您也可以考虑将<代码>国家> /代码>和<代码>语言< /代码>字段分隔为一个单独的类,如<代码> MyListKey <代码>,其具有正确的<>代码>均衡器()/<代码>和<代码> HASCODE()/<代码>方法,然后使用<代码> map < /C> >。您的代码将是:

return myMap.get(new MyListKey("India", "Hindi"));

是的,可以使用迭代器进行此操作。大致如下所示:

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

        return m.getNumber();
    }
}
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;
}

但是,您也可以考虑将<代码>国家> /代码>和<代码>语言< /代码>字段分隔为一个单独的类,如<代码> MyListKey <代码>,其具有正确的<>代码>均衡器()/<代码>和<代码> HASCODE()/<代码>方法,然后使用<代码> map < /C> >。您的代码将是:

return myMap.get(new MyListKey("India", "Hindi"));
像这样的事情:

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

        return m.getNumber();
    }
}
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;
}
像这样的事情:

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

        return m.getNumber();
    }
}
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;
}

如果对象的顺序不重要,则应更改为使用贴图

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


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

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

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


如果您想排序,请考虑使用集合。MyObject应该扩展可比较的

“字符串编号;”-这是对的吗?@BrianAgnew:没关系。我想根据对象列表中对象的前两个属性获取第三个属性(数字或字符串)。“字符串编号;”-是否正确?@BrianAgnew:没关系。我想根据对象列表中对象的前两个属性获取第三个属性(数字或字符串)。是。试图将myList转换为Map,其中列表键将由前两个属性组成。@Nikunchauhan:否,您应该将语言/国家对本身提取为一个单独的对象,并制作一个
Map
有什么特殊原因吗?我不想去上额外的课。使用内部类可以做到这一点吗?额外的类大约有10行,但是这样组织代码会更好。像这样在
列表中键入
映射
是非常糟糕的代码实践。@Nikunchauhan:你可以使用嵌套类,当然-它仍然是一个额外的类。但正如路易斯所说,这将比使用列表有很大的改进。是的。试图将myList转换为Map,其中列表键将由前两个属性组成。@Nikunchauhan:否,您应该将语言/国家对本身提取为一个单独的对象,并制作一个
Map
有什么特殊原因吗?我不想去上额外的课。使用内部类可以做到这一点吗?额外的类大约有10行,但是这样组织代码会更好。像这样在
列表中键入
映射
是非常糟糕的代码实践。@Nikunchauhan:你可以使用嵌套类,当然-它仍然是一个额外的类。但正如路易斯所说,这将比使用列表有很大的改进。是的。正在尝试将myList转换为映射,其中列表键将由前两个属性组成。是。正在尝试将myList转换为映射,其中列表键将由前两个属性组成。