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

この方法でリストを照会するにはどうすればよいですか?イテレータを介して可能ですか?

読んでくれてありがとう。

4

6 に答える 6

3

オブジェクトの言語と国のプロパティは、私の場合、一意のキーになります。

それなら、おそらく地図を使ってみるべきだと思います...

この方法でリストを照会するにはどうすればよいですか?イテレータを介して可能ですか?

絶対に-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国と言語を含み、2つのフィールドをオーバーライドequals()してhashCode()基づいたクラスを作成すると、より効率的になります。次に、を使用して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();
    }
}

countryただし、とフィールドを、正しいメソッドとメソッドを持つlanguage別のクラスに移動してから、を使用することも検討できます。その場合、コードは次のようになります。MyListKeyequals()hashCode()Map<MyListKey, String>

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

オブジェクトの順序が問題にならない場合は、マップを使用するように変更する必要があります。

イテレータを使用し、入力値を比較して結果を見つけることができます

並べ替えが必要な場合は、コレクションの使用を検討してください。MyObjectはComparableを拡張する必要があります

于 2012-08-02T10:10:50.433 に答える