我已经看到了有关Set
根据索引值从中获取对象的其他问题,并且我理解为什么这是不可能的。但是我无法找到一个很好的解释,说明为什么不允许按对象获取,所以我想问一下。
HashSet
有a作为后盾,HashMap
因此从中获取对象应该非常简单。现在看来,我将不得不遍历中的每个项目HashSet
并测试是否相等,这似乎是不必要的。
我可以只使用a,Map
但不需要key:value对,我只需要一个Set
。
例如说我有Foo.java
:
package example;
import java.io.Serializable;
public class Foo implements Serializable {
String _id;
String _description;
public Foo(String id){
this._id = id
}
public void setDescription(String description){
this._description = description;
}
public String getDescription(){
return this._description;
}
public boolean equals(Object obj) {
//equals code, checks if id's are equal
}
public int hashCode() {
//hash code calculation
}
}
和Example.java
:
package example;
import java.util.HashSet;
public class Example {
public static void main(String[] args){
HashSet<Foo> set = new HashSet<Foo>();
Foo foo1 = new Foo("1");
foo1.setDescription("Number 1");
set.add(foo1);
set.add(new Foo("2"));
//I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
System.out.println(theFoo.getDescription); //Should print Number 1
}
}
是否因为equals方法用于测试“绝对”相等而不是“逻辑”相等(在这种情况下contains(Object o)
就足够了)?
A Set
是被视为重复Collection
对象的对象a.equals(b) == true
,因此尝试获取您已经拥有的相同对象没有任何意义。
如果您尝试get(Object)
从集合中获取,则a Map
可能更合适。
你应该写的是
Map<String, String> map = new LinkedHashMap<>();
map.put("1", "Number 1");
map.put("2", null);
String description = map.get("1");
如果对象不在集合中(基于等值),请将其添加(如果对象在集合中(基于等值)),请给我该对象的集合实例
在极少数情况下,您可以使用Map
。
Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap
Bar bar1 = new Bar(1);
map.put(bar1, bar1);
Bar bar1a = map.get(new Bar(1));
问题内容: 我确信这是有充分理由的,但是有人可以解释一下为什么缺少接口或任何类似方法吗? 集合似乎很适合放入东西,但我找不到从其中检索单个项目的优雅方法。 如果我知道我想要第一个项目,则可以使用,但否则似乎必须转换为数组才能在特定索引处检索项目? 从集合中检索数据的适当方法是什么?(除了使用迭代器之外) 我敢肯定,将其排除在API中这一事实意味着有充分的理由不这样做-有人可以启发我吗? 编辑: 这
我已经看到了关于基于索引值从中获取对象的其他问题,我明白为什么这是不可能的。但是我还没有找到一个很好的解释来解释为什么不允许获取对象,所以我想我会问。 HashSet由HashMap支持,因此从中获取对象应该非常简单。现在看来,我必须迭代HashSet中的每个项,并测试似乎不必要的相等性。 我可以只使用,但我不需要键:值对,我只需要一个。 例如,假设我有Foo。java: 和: 是不是因为equa
问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和
问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)
当使用Java8流时,获取一个列表、从中创建一个流、处理业务并将其转换回来是很常见的。类似于: 有什么想法吗?
问题内容: 这确实是一个好奇心,而不是一个问题。 为什么类没有方法?现在看来似乎应该当你认为它有一个事实,,等方法。 我知道您可以执行以下操作: 但是为什么没有方法呢? 问题答案: 原因是Scanner类旨在读取以空格分隔的令牌。这是包装基础输入流的便捷类。在扫描仪之前,您所能做的只是读取单个字节,如果要读取单词或行,这将是一个很大的麻烦。使用Scanner,您可以传入System.in,它会执行