优化嵌套if语句中的循环嵌套

时间:2020-01-08 21:33:54

标签: java performance

我正在尝试优化此代码。我能想到的唯一优化是在第二个if条件内,applyOfferChanges(...)之后的return或break语句。 有什么想法吗?

void applyFavoriteChangesToMerchantStore(){

    List<Merchant> favoriteMerchantsList = FavoriteMerchantStore.getInstance().getFavoriteMerchantsList();
    if(favoriteMerchantsList != null && !favoriteMerchantsList.isEmpty()) {
        List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();
        for (Merchant storeMerchant : storeMerchantList) {
            for (Merchant favoriteMerchant: favoriteMerchantsList){
                if(TextUtils.equals(storeMerchant.getId(), favoriteMerchant.getId())){
                    //merchant match found
                    //set merchant favorite status

                   storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());
                    //set offer favorite status
                    applyOfferChanges(favoriteMerchant.getOffferList(),
                            storeMerchant.getOffferList());
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这完全取决于您未向我们展示的内容。列表有多大,TextUtils.equals到底是什么?假设是android.text.TextUtils,答案很明确:使用两个O(m*n)(复杂度HashMap)代替两个嵌套循环(复杂度O(m+n))。

代替

for (Merchant storeMerchant : storeMerchantList) {
    for (Merchant favoriteMerchant: favoriteMerchantsList) {
         if(TextUtils.equals(storeMerchant.getId(), favoriteMerchant.getId())) {
             ....
         }

Map<String, Merchant> favoriteMerchantMap = new HashMap<>();
for (Merchant favoriteMerchant : favoriteMerchantsList) {
    favoriteMerchantMap.put(favoriteMerchant.getId(), favoriteMerchant));
}
for (Merchant storeMerchant : storeMerchantList) {
    Merchant favoriteMerchant = favoriteMerchantMap.get(storeMerchant.getId());
    if (favoriteMerchant != null) {
             ....
    }

答案 1 :(得分:0)

我认为您可以使用java-8对此进行优化。

如果我没记错的话,如果无法再找到它们,则您的代码不会将收藏夹设置为null。

这应该与原始代码相同,但是采用的是Java-8方式:

无效applyFavoriteChangesToMerchantStore(){ //获取喜欢的商人列表 列出favoriteMerchantsList = FavoriteMerchantStore.getInstance()。getFavoriteMerchantsList();

// if any favorites found, we gotta do something with them
if(favoriteMerchantsList != null && !favoriteMerchantsList.isEmpty()) {

    // take list of all merchants
    List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();

    // convert those into a map with the ids as keys
    Map<String, Merchant> storeMap = storeMerchantList.stream().collect(Collectors.toMap(Merchant::getId, merchant -> merchant));

    // set the favorite for each merchant
    favoriteMerchantsList.forEach(favoriteMerchant -> {

        // if each favorite is guaranteed to be in the list of storeMerchantList, this causes no null result
        Merchant storeMerchant = storeMap.get(favoriteMerchant.getId());

        //set merchant favorite status
        storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());

        //set offer favorite status
        applyOfferChanges(favoriteMerchant.getOffferList(), storeMerchant.getOffferList());
    });
}

}

如果您想重置(设置为null)当前与“我的收藏”不匹配的商家,则您的代码应如下所示:

无效applyFavoriteChangesToMerchantStore(){ //获取喜欢的商人列表 列出favoriteMerchantsList = FavoriteMerchantStore.getInstance()。getFavoriteMerchantsList();

Map<String, Merchant> favMap = null;

if(favoriteMerchantsList == null) {
    // if no favorites found, creating an empty map
    favMap = new HashMap<>();
} else {
    // convert list into a map with the ids as keys
    favMap = favoriteMerchantsList.stream().collect(Collectors.toMap(Merchant::getId, merchant -> merchant));
}

// take list of all merchants
List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();

// set the favorite for each merchant
storeMerchantList.forEach(storeMerchant -> {

        if (favMap.containsKey(storeMerchant.getId()))
        {
            // get the favorite
            Merchant favoriteMerchant = favMap.get(storeMerchant.getId());

            //set merchant favorite status
            storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());

            //set offer favorite status
            applyOfferChanges(favoriteMerchant.getOffferList(), storeMerchant.getOffferList());
        } else {
            //set merchant favorite status
            storeMerchant.setFavoriteMerchant(null);

            // cannot call applyOfferChanges, because no favoriteMerchant (or change this as you wish)
        }
    });
}

}

尽管没有任何测试,我希望他们能工作,如果有帮助,请随时做出答复。