оптимизировать вложенные циклы внутри вложенных операторов if - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь оптимизировать этот код. Единственная оптимизация, о которой я могу подумать, - это оператор return или break после applyOfferChanges (...) внутри второго условия if. Есть идеи?

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 голосов
/ 09 января 2020

Я думаю, вы могли бы оптимизировать это с помощью java -8.

Если я не ошибаюсь, ваш код не устанавливает для фаворитов ноль, если их больше нельзя найти.

Это должно сделать то же самое, что и ваш исходный код, но более java -8 образом:

void applyFavoriteChangesToMerchantStore () {// взять список избранных торговцев List favourMerchantsList = 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());
    });
}

}

Если вы хотите сбросить (установить на ноль) тех торговцев, которые в настоящее время не имеют фаворитов, ваш код может выглядеть следующим образом:

void applyFavoriteChangesToMerchantStore () {// взять список избранных продавцов Не стесняйтесь отвечать, если это помогло.

0 голосов
/ 09 января 2020

Все зависит от того, что вы нам не показали. Насколько велики списки, что именно делает 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) {
             ....
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...