Как отфильтровать список по нескольким критериям? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу отфильтровать список по 4 параметрам.Но я не могу получить ожидаемый вывод, который мне нужен.

Если более одного параметра не пусто или не пусто, я хочу, чтобы отношение нескольких if-else стало AND.
Если значение имеет только один параметр, то отношение будет ИЛИ.

Случай 1: когда tagUId не пуст и состояние не равно нулю

Вход:title = "", tagUId = "12" , status = true , pullStatus = nullОжидаемый результат:Только тег с tagUId содержит «12» И статус true будет включен в список результатов.

Случай 2: когда tagUId не пуст, состояние не равно нулю, pullStatus не равно нулю

Вход:title = "", tagUId = "12" , status = true , pullStatus = false Ожидаемый результат:Только тэг с tagUId содержит «12» И статус true, а pullStatus false - будет включен в список результатов.

public static ArrayList<TagEntity> SearchTagsBy(String title, String tagUId, Boolean status, Boolean pullStatus){
    HashSet<TagEntity> result = new HashSet<>();
    ArrayList<TagEntity> tags = GetTagList();

    if (title.isEmpty() && tagUId.isEmpty() && status == null && pullStatus == null) {
        result.addAll(tags); //default parameters == show all tag
    }else{

        if(!title.isEmpty()){
            result.addAll(FilterTitle(tags, title));
        }

        if(!tagUId.isEmpty()){
            result.addAll(FilterTagUId(tags, tagUId));
        }

        if(status != null){
            result.addAll(FilterStatus(tags, status));
        }

        if(pullStatus != null){
            result.addAll(FilterPullStatus(tags, pullStatus));
        }

    }

    return new ArrayList<>(result);
}

private static Collection<? extends TagEntity> FilterPullStatus(ArrayList<TagEntity> tags, Boolean pullStatus) {
    HashSet<TagEntity> result = new HashSet<>();

    for (TagEntity tag: tags) {
        if (tag.getHasPulled().equals(pullStatus)){
            result.add(tag);
        }

    }

    return result;
}

private static Collection<? extends TagEntity> FilterStatus(ArrayList<TagEntity> tags, Boolean status) {
    HashSet<TagEntity> result = new HashSet<>();

    for (TagEntity tag: tags) {
        if (tag.getStatus().equals(status)){
            result.add(tag);
        }

    }

    return result;
}

private static Collection<? extends TagEntity> FilterTagUId(ArrayList<TagEntity> tags, String tagUId) {
    HashSet<TagEntity> result = new HashSet<>();

    for (TagEntity tag: tags) {
        if (tag.getUId().contains(tagUId)){
            result.add(tag);
        }

    }

    return result;
}

private static HashSet<TagEntity> FilterTitle(ArrayList<TagEntity> tags, String title){
    HashSet<TagEntity> result = new HashSet<>();

    for (TagEntity tag: tags) {
        if (tag.getTitle().contains(title)){
            result.add(tag);
        }

    }

    return result;
}

1 Ответ

0 голосов
/ 26 декабря 2018

Попробуйте это;

public static ArrayList<TagEntity> SearchTagsBy(String title, String tagUId, Boolean status, Boolean pullStatus){

    ArrayList<TagEntity> result = new ArrayList<>();
    ArrayList<TagEntity> tags = GetTagList();

    for(TagEntity tag: tags)
    {
        boolean checkTitle, checkUId, checkStatus, checkPullStatus;

        if(title.isEmpty()) checkTitle = true; else checkTitle = tag.getTitle().contains(title);

        if(tagUId.isEmpty()) checkUId = true; else checkUId = tag.getUId().contains(tagUId);

        if(status == null)checkStatus = true; else checkStatus = tag.getStatus().equals(status);

        if(pullStatus == null)checkPullStatus = true; else checkPullStatus = tag.getHasPulled().equals(pullStatus);

       if( checkTitle && checkUId && checkStatus && checkPullStatus)
             result.add(tag);
    }

    return result;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...