快速方法将String []与List进行比较

Ann*_*lee 4 java algorithm

我想将String数组与具有市场对象的列表进行比较.

我实现了这样的代码:

private List<Data> addMarketData(List<Data> list) {
    String[] SEE = new String[]{"Albania", "Bosnia and Herzegovina", "Bulgaria", "Croatia", "Macedonia FYR", "Moldavia", "Montenegro", "Romania", "Serbia", "Slovenia" };
    List<String> seeList = Arrays.asList(SEE);
    String[] CEE = new String[]{"Czech Republic", "Hungary", "Poland", "Slovakia"}; 
    List<String> ceeList = Arrays.asList(CEE);
    for (int i = 0; i < list.size(); i++) {
        for (int j = 0; j < seeList.size(); j++) {
            if(list.get(i).getPropertyCountry().equals(seeList.get(j).toString())) {
                list.get(i).setMarket("SEE");
            }   
        }
        for (int k = 0; k < ceeList.size(); k++) {
            if(list.get(i).getPropertyCountry().equals(ceeList.get(k).toString())) {
                list.get(i).setMarket("CEE");
            }   
        }
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)

但是,我相信这段代码会产生比实际应用更多的开销.特别是for循环.我可以只使用一个循环吗?

因此,如何使这段代码更快?

我感谢你的回答!

Lui*_*oza 7

将所有数据移动到Set<String>:

String[] SEE = ...
Set<String> setSEE = new HashSet<>(Arrays.asList(SEE));
String[] CEE = ...
Set<String> setCEE = new HashSet<>(Arrays.asList(CEE));
for (Data data : list) {
    if (setSEE.contains(data.getPropertyCountry()) {
        data.setMarket("SEE");
    } else if (setCEE.contains(data.getPropertyCountry()) {
        data.setMarket("CEE");
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会产生您可能想到的开销.此外,它比您当前的O(N ^ 2)方法更快.

另一个想法是将这些数组的数据移动到@NarmerMap<String, String>提出的数据中,但在这种情况下,应该在地图中找不到国家/地区时定义一个值.


从Java 7开始,您可以使用diamond运算符.对于Java 5和6,您必须指定整个泛型用法:

Set<String> setSEE = new HashSet<String>(Arrays.asList(SEE));
//...
Set<String> setCEE = new HashSet<String>(Arrays.asList(CEE));
Run Code Online (Sandbox Code Playgroud)