【问题标题】:Searching object arraylist confusion搜索对象数组列表混淆
【发布时间】:2012-01-26 05:22:45
【问题描述】:

我在我的 arralist 中编写了一个搜索对象的方法,但是我需要这个搜索来获取两个参数并将它们与对象的描述进行比较。令我困惑的是,我不知道如何让我的方法采用两个参数,而这两个参数与一个描述相比。 例如对象描述:蓝色野马

现在搜索方法必须采用两个参数,在这种情况下一个字符串“Blue”和一个字符串“Mustang”,我不知道该怎么做。我找到了一种方法,可以将完整的描述写成一个参数,并且效果很好。我将离开我试图更改以查找两个参数的方法,以及采用一个参数并且工作正常的方法。值得一提的是,该方法还需要寻找未租借的汽车,这就是为什么还要与租用日期进行比较,因为如果汽车是租借的,就会有一辆,否则就没有。

尝试更改它以查找两个参数:

public Car searchCar(String description, String description2)
{
    for (Car car : cars) {
        if (car.getDescription().equals(description) && car.getDescription().equals(description2) && car.getHireDate().equals("")) {

            System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
            return car;

        }
        else if (car.getHireDate() != ("")) {
            System.out.println("This car is rented!!");
        }
        else {

        }
    }
    return null;
}

这是一个带一个参数并且工作正常的:

public Car searchCar(String description)
{
    for (Car car : cars) {
        if (car.getDescription().equals(description) && car.getHireDate().equals("")) {

            System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
            return car;

        }
        else if (car.getHireDate() != ("")) {
            System.out.println("This car is rented!!");
        }
        else {

        }
    }
    return null;
}

【问题讨论】:

  • 您想要精确匹配还是所有包含参数的对象?

标签: java search methods parameters arraylist


【解决方案1】:

description 必须与 description2 相同 你可以这样做:

String fulldescription=description+" "+description2;

然后

if (car.getDescription().equals(fulldescription)...

可以采用不同的方法

 if (car.getDescription().indexOf(description)>0 && car.getDescription().indexOf(description2)>0 )...

【讨论】:

    【解决方案2】:

    描述不太可能完全等于两个参数。也许您只是想匹配描述的部分

    contains 之类的内容可能会引起您的兴趣。

    还要注意这一行:

    else if (car.getHireDate() != ("")) {
    

    不会像你期望的那样工作;您正确比较了上一条语句中的字符串(使用equals),但在这里没有这样做。

    【讨论】:

      【解决方案3】:

      首先,您应该定义是否需要完全匹配,或者是否应该包含参数,并且描述中可能会有额外的文字。

      完全匹配

      对于完全匹配,您可以使用 or 条件:

      if ( (car.getDescription().equals(description) | car.getDescription().equals(description2) ) && car.getHireDate().equals("") ) {
         ... 
      }
      

      这意味着如果描述完全匹配descriptiondescription2你会得到一个成功。

      如果您知道顺序,您也可以连接参数:

      if ( car.getDescription().equals(description + " " + description2) && car.getHireDate().equals("") ) {
         ... 
      }
      

      这将匹配“Blue Mustang”,但不匹配“Mustang Blue”。

      您可以选择将连接的字符串设置为正则表达式,以便允许任意空格:

      if ( car.getDescription().matches("\\s*\\b" + description + "\\b\\s*\\b" + description2 + "\\b\\s*") && car.getHireDate().equals("") ) {
         ... 
      }
      

      这将匹配“    Blue   Mustang    ”等,但由于单词边界要求("\\b")而不匹配“BlueMustang”。

      请注意,还有更多可能性,因此您应该首先定义要如何匹配。

      包含的参数

      如果您想获取所有包含两个参数的描述,请改用contains(...)

      if ( car.getDescription().contains(description) && car.getDescription().contains(description2) && car.getHireDate().equals("") ) {
         ... 
      }
      

      请注意,这也将匹配“Blue Ford Mustang”(“Blue”和“Mustang”是参数)。

      【讨论】:

        【解决方案4】:

        为了测试子串的出现,你可以使用indexOf() (docs):

        if (-1 != car.getDescription().indexOf(description) && 
            -1 != && car.getDescription().indexOf(description2) &&
            car.getHireDate().equals("")) {
        

        您可能也想让比较不区分大小写。

        【讨论】:

          【解决方案5】:

          我建议使用containstoLowerCase 进行字符串搜索。还可以考虑这样的变量参数搜索方法:

          public Car searchCar(String...descriptions) {
              for (Car car : cars) {
                  if (car.getHireDate().equals("")) {
                      for (String d : descriptions) {
                         // assuming car.getDescription() != null
                         if (car.getDescription().toLowerCase().contains(d.toLowerCase())) {
                            System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
                            return car;
                         }
                      }
                  }
                  else
                      System.out.println("This car is rented!!");
              }
              return null;
          }
          

          然后你可以像这样调用这个方法:

          Car c1 = searchCar("blue");
          

          Car c1 = searchCar("blue", "toyota");
          

          Car c1 = searchCar("blue", "red", "toyota", "mustang", "honda");
          

          【讨论】:

            【解决方案6】:

            考虑将您的搜索/匹配封装在一个类中,您可以扩充该类以包含您需要的任何搜索条件。

            这是一个满足您当前要求的示例。

             class CarSearch {
            
                private boolean isIncludeHired;
                private String[] descriptionWords;
                private boolean isCaseInsensitive;
            
                public void setIncludeHired(boolean b) {
                    isIncludeHired = b;
                }
            
                public void setCaseInsensitive(boolean b) {
                    this.isCaseInsensitive = b;
                }
            
                public void setDescriptionWords(String[] words) {
                    this.descriptionWords = words;
                }
            
                public boolean matches(Car car) {
            
                    boolean matches = true;
            
                    if (!isIncludeHired) {
                        if (car.getHireDate() != null) {
                            matches = false;
                        }
                    }
            
                    if (matches && descriptionWords != null) {
                        String description = car.getDescription();
                        if (isCaseInsensitive) {
                            description = description.toLowerCase();
                        }
                        boolean allMatch = true;
                        for (String word: descriptionWords) {
                            if (isCaseInsensitive) {
                                word = word.toLowerCase();
                            }
                            if (!description.contains(word)) {
                                allMatch = false;
                                break;
                            }
                        }
                        matches = allMatch;
                    }
            
                    return matches;
                }
            
                public List<Car> search(List<Car> cars) {
                    List<Car> matched = new ArrayList<Car>();
            
                    for (Car car: cars) {
                        if (matches(car)) {
                            matched.add(car);
                        }
                    }
                    return matched;
                }
            }
            

            所以现在你可以这样做:

                CarSearch search = new CarSearch();
                search.setCaseInsensitive(true);
                search.setIncludeHired(false);
                search.setDescriptionWords(new String[]{"blue", "mustang"});
            
                List<Car> matches = search.search(cars);
            

            您还可以轻松更改您的 CarSearch 类以允许其他操作,例如完全匹配、按聘用日期搜索、按注册搜索等。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-07-28
              • 2012-08-13
              • 2022-11-22
              • 1970-01-01
              • 2016-09-10
              • 1970-01-01
              • 2013-03-30
              • 2021-11-17
              相关资源
              最近更新 更多