首页 > 解决方案 > 重构 Java 程序

问题描述

问题:我有一个数组中的房屋列表。我需要确保至少一份清单只包含有猫的房子,而至少一份清单只包含有狗的房子。一个列表应该只包含一种房屋(即没有混合大小写)。假设一个房子可以养一只猫或一只狗。

我尝试编写代码,但它看起来不太好,希望您在重构或改进设计方面提供帮助。

    Boolean isListWithHouseAndCatExist = false;
    Boolean isListWithHouseAndDogExist = false;
    List<House>[] arrOfHouseList = getArrOfHouseList();
    for(List<House> houseList : arrOfHouseList){
       Boolean isHousesWithCat = true;
       Boolean isHousesWithDog = true;
       for(House house: houseList){
          if(house.hasCat()){
             isHousesWithDog = false;
          }else{
             isHousesWithCat = false;
          }
       }
       if(!isHousesWithDog && ! isHousesWithCat){
          return false; //This is mixed case. The list contains both of kind of houses
       }
       isListWithHouseAndCatExist=isHousesWithCat?true:isListWithHouseAndCatExist;
       isListWithHouseAndDogExist=isHousesWithDog?true:isListWithHouseAndDogExist;  
    }

    // Now to check that we have atleast one list with all House-Cat and atleast one list with all
    // House-Dog
    if(!isListWithHouseAndCatExist || !isListWithHouseAndDogExist){
      return false;
   }
   return true;

如您所见,我必须使用四个布尔变量来验证条件。您能否帮助改进代码。

标签: java

解决方案


如果您不想使用流并且只想迭代一次,则可以执行以下操作:

    Boolean isListWithHouseAndCatExist = false;
    Boolean isListWithHouseAndDogExist = false;
    List<House>[] arrOfHouseList = getArrOfHouseList();
    for(List<House> houseList : arrOfHouseList){

        Set<Boolean> hasCatFlags = new HashSet<>();
        for(House house: houseList){
            hasCatFlags.add(house.hasCat());
        }
        if(hasCatFlags.size() > 1){
            return false; //This is mixed case. The list contains both of kind of houses
        }
        if (hasCatFlags.contains(true)) {
            isListWithHouseAndCatExist = true;
        } else if (hasCatFlags.contains(false)) {
            isListWithHouseAndDogExist = true;
        }
    }

    return isListWithHouseAndCatExist && isListWithHouseAndDogExist;

如果您可以使用流但只想迭代一次,则可以执行以下操作:

    Boolean isListWithHouseAndCatExist = false;
    Boolean isListWithHouseAndDogExist = false;
    List<House>[] arrOfHouseList = getArrOfHouseList();
    for(List<House> houseList : arrOfHouseList){

        Set<Boolean> hasCatFlags = houseList.stream().map(House::hasCat).collect(Collectors.toSet());
        if(hasCatFlags.size() > 1){
            return false; //This is mixed case. The list contains both of kind of houses
        }

        if (hasCatFlags.contains(true)) {
            isListWithHouseAndCatExist = true;
        } else if (hasCatFlags.contains(false)) {
            isListWithHouseAndDogExist = true;
        }
    }

    return isListWithHouseAndCatExist && isListWithHouseAndDogExist;

如果你可以使用流并且不介意迭代两次,你可以这样做:

    Boolean isListWithHouseAndCatExist = false;
    Boolean isListWithHouseAndDogExist = false;
    for(List<House> houseList : getArrOfHouseList()){
        if (houseList.stream().allMatch(House::hasCat)) {
            isListWithHouseAndCatExist = true;
        } else if (houseList.stream().noneMatch(House::hasCat)) {
            isListWithHouseAndDogExist = true;
        } else {
            return false;//mixed case
        } 
    }

    return isListWithHouseAndCatExist && isListWithHouseAndDogExist;

推荐阅读