【问题标题】:Set and HashSet JavaSet 和 HashSet Java
【发布时间】:2014-11-08 19:01:06
【问题描述】:

我对 Java 语言比较陌生,并且有一个我正在为学校做的项目,其中我有一个 Book 类,它具有该类的普通 setter/getter、构造函数和覆盖,没有什么复杂的。我必须更改它,以便我可以通过使用 Set 和 HashSet 获得多个作者。我的问题是我将如何去做这件事?到目前为止,如果我错了,请纠正我,我有这个

import java.util.*;

public class Book{

       private Set<String> authorSet;
       private String isbn;

       public Book(){
           authorSet = null;
           isbn = null;
       }

       public Book(String isbn, Set<String> authorSet){
           this.isbn = isbn;
           Set<String> s = new HashSet<String>();

           // Do I do anything else here?
       }

       public String getIsbn(){
            return isbn;
       }

       public void setIsnb(String isbn){
            this.isbn = isbn;
       }

       public Set<String> getAuthorSet(Set<String> newAuthorSet{
            return newAuthorSet;
       }

       public void setAuthorSet(Set<String> newAuthorSet){
            this.authorSet = newAuthorSet;
       }

在继续进行覆盖之前,我想确保我正确理解了这一点。我试图寻找类似的例子,这样我就可以看到发生了什么,但到目前为止我还没有多少运气。我敢肯定这很简单,但我才刚刚开始学习这门语言。感谢您的帮助

【问题讨论】:

  • 你有什么问题?您是指会阻止编译的拼写错误吗?

标签: java collections set hashset


【解决方案1】:

首先,在你的默认构造函数中,去掉

authorSet = null;

而是将您的 authorSet 变量初始化为一个新的 HashSet。这样做的原因是您要创建 authorSet 容器,而不管是否添加了任何作者。

您可能需要一个只接受 isbn 字符串的构造函数。还要考虑一个构造函数,它采用 isbn 字符串和可变数量的作者字符串。


啊,我错过了:

  public Book(String isbn, Set<String> authorSet){
       this.isbn = isbn;
       Set<String> s = new HashSet<String>();

       // Do I do anything else here?
   }

不好,因为您忽略了参数和字段!而是将 set 参数分配给现有字段,就像对任何其他字段一样。

  public Book(String isbn, Set<String> authorSet){
       this.isbn = isbn;
       this.authorSet = authorSet;
   }

然后给你的班级一个addAuthor(String author) 方法。最好为您编写代码,因为这是家庭作业。对于这个问题,我真的不认为你需要更多的东西。

【讨论】:

  • 另外,采用Set 的构造函数应该将传入的一个分配给authorSet,而不是创建一个新的。
  • 也许能详细说明一下为什么他应该摆脱authorSet = null;,为了学习?
  • @azurefrog:哎呀错过了!谢谢!
  • 我是否将 authorSet 放入新的 HashSet(authorSet) 中?另外,我应该保持 hashSet 不变,还是将它移到默认构造函数中?
  • @user2649644:什么?不,只需创建一个空的 HashSet 并将其分配给 authorSet 变量。将 null 变量传递给 HashSet 构造函数没有任何好处。
【解决方案2】:

我会取消默认构造函数。另外,为什么需要设置 authorSet?只是添加和删除它不是更好吗?还有为什么你需要设置isbn。你能不能把它放在构造函数中,因为我认为你不必改变它。这样的事情怎么样?

import java.util.HashSet;
import java.util.Set;

public class Book {

    private final Set<String> authorSet;
    private final String isbn;

    public Book(String isbn) {
        this.isbn = isbn;
        this.authorSet = new HashSet<>();
    }

    public String getIsbn() {
        return isbn;
    }

    public Set<String> getAuthorSet() {
        return authorSet;
    }

    public void addAuthor(String author) {
        authorSet.add(author);
    }

    public void removeAuthor(String author) {
        authorSet.remove(author);
    }
}

【讨论】:

  • 我认为拥有 setIsbn 的目的是了解前进的方法。我没有必要,但教授希望它包含相同的内容
  • 好吧,添加它。不过,请注意缺少默认构造函数和使用 final 关键字。
【解决方案3】:

对于额外的点,返回您的实际集合(集合)实现的做法可以让调用者对您的内部进行处理。因此,这有点危险:

public Set<String> getAuthorSet() {
    return authorSet;
}

更安全:

public Set<String> getAuthorSet() {
    return Collections.unmodifiableSet(authorSet);
}

类似地,如果您需要在 API 中接受一个新集合,但又不想相信调用者以后不会违反您的表述,那么您可以这样做:

public void setAuthorSet(Set<String> newAuthorSet) {
    authorSet = new HashSet<String>(newAuthorSet);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 2018-10-31
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多