【问题标题】:Searching an ArrayList for a matching parameter在 ArrayList 中搜索匹配的参数
【发布时间】:2021-11-07 16:58:07
【问题描述】:

我有两个课程MuseumPaintingPainting 类按预期工作,但我遇到了 Museum 类的问题。该方法的目的是返回一个博物馆拥有的画作的ArrayList,它与参数字符串匹配。

当我尝试编译代码时,我收到很多错误消息,显然我没有正确编译代码。

例如,如果有毕加索的绘画 - 它应该只返回所有这些绘画,而不是其他任何东西。

我想我可能错过了一步 - 可能是先创建一个局部变量来存储它,但我有点困难。我也想知道当ArrayList使用Painting对象时String是否正确。

有人知道我在这里缺少什么吗?

public class Museum  {
    //creating the fields
    private ArrayList<Painting> paintings;
    private String name;

    /**
     * Create a Museum Class 
     */
    public Museum(String aMuseum) {
        paintings = new ArrayList<>();
        name = aMuseum;
    }

    public String listMatches(String searchString)
    {
        if(filename.equals(searchString)) {
            return filename;
        }
    }
}

【问题讨论】:

  • filename 是从哪里来的?您可能想分享您的Painting 课程。
  • 您的Museum 应该有List&lt;Painting&gt;,而不是ArrayList。始终编​​码到接口,而不是实现。

标签: java arraylist parameters equals


【解决方案1】:

按艺术家搜索绘画应返回绘画子列表(如果没有找到绘画,则可能为空):

public List<Painting> listMatches(String artist) {
    List<Painting> matches = new ArrayList<>();
    for (Painting painting : paintings) {
        if (artist.equals(painting.getArtist())) {
            matches.add(painting);
        }
    }

    return matches;
}

Stream API 可用于此(更简洁和功能性的风格):

public List<Painting> listMatches(String artist) {
    return paintings.stream()
        .filter(p -> artist.equals(p.getArtist()))
        .collect(Collectors.toList());
}

【讨论】:

    【解决方案2】:

    好的,我假设在您的绘画类中,您有一个属性是 Author 和一个 getter。

    我已将 listMatches 方法更改为有一个 for-each 循环。此循环将遍历您的绘画数组列表中的每个元素,并将其作者的姓名保存在局部变量中。如果当前绘画的作者与您要查找的作者匹配,它将打印标题。

    我将 listMatches 的返回类型从 String 更改为 void,因为您没有返回任何内容,只是打印。

    如果您想使用它们,您可以将绘画保存在某个地方(例如另一个 ArrayList),而不仅仅是打印名称。请记住更改返回类型,因为在这种情况下您将返回一些东西。

    记得把作者的名字写成你在画中的名字,否则它可能找不到它。

    我还没有机会尝试,但它应该可以工作。


    public class Museum  {
    //creating the fields
    private ArrayList<Painting> paintings;
    private String name;
    
    /**
     * Create a Museum Class 
     */
    public Museum(String aMuseum) {
        paintings = new ArrayList<>();
        name = aMuseum;
    }
    
    public void listMatches(String searchString)
    {
      String this_painting_author = new String();
      for (Painting painting : paintings){
        this_painting_author = painting.getAuthor();
        if(this_painting_author.equals(searchString)) {
          System.out.println(painting.getTitle());
        }
      }
    }
    }
    

    【讨论】:

    • 谢谢你 - 非常有效,我只需要调整一些并更改为退货声明。
    • Java 按照惯例使用camelCase 而不是snake_case,并且没有理由在循环之前声明字符串,也没有理由使用new String() 对其进行初始化。你甚至不需要一个局部变量来保存painting.getAuthor()的结果,你可以直接使用它。
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多