我已经看到了关于基于索引值从Set
中获取对象的其他问题,我明白为什么这是不可能的。但是我还没有找到一个很好的解释来解释为什么不允许获取对象,所以我想我会问。
HashSet由HashMap支持,因此从中获取对象应该非常简单。现在看来,我必须迭代HashSet中的每个项,并测试似乎不必要的相等性。
我可以只使用Map
,但我不需要键:值对,我只需要一个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方法旨在测试“绝对”相等,而不是“逻辑”相等(在这种情况下,包含(对象o)就足够了)?
你的最后一句话就是答案。
get(Object o)
将通过哈希集运行,寻找另一个等于o的对象(使用等于(o)的方法)。因此,它确实与包含(o)相同,只是没有返回相同的结果。
集合是对象的集合,它将A.equals(b)=true作为重复对象,因此尝试获取您已经拥有的相同对象是没有意义的。
如果您尝试从集合中get(Object)
,Map
可能更合适。
你应该写的是
Map<String, String> map = new LinkedHashMap<>();
map.put("1", "Number 1");
map.put("2", null);
String description = map.get("1");
如果一个对象不在集合中(基于equals),请添加它,如果它在集合中(基于equals),请给我该对象的集合实例
在不太可能的情况下,您可以使用地图。
Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap
Bar bar1 = new Bar(1);
map.put(bar1, bar1);
Bar bar1a = map.get(new Bar(1));
Java地图/收藏备忘单
它将只包含键/值对还是值?
1) 如果它包含对,则选择是一个映射。订单重要吗?
. 1-1)如果是,遵循插入顺序或按键排序?
. . 1-1-1)如果订购,LinkedHashMap
. . 1-1-2)如果已排序,则树形映射
. 1-2)如果顺序不重要,则HashMap
2)如果它只存储值,则选择是一个集合。它会包含重复项吗?
. 2-1)如果是,ArrayList
. 2-2)如果不包含重复项,主要任务是否搜索元素(包含/删除)?
...2-2-1)如果没有,ArrayList
. . 2-2-2)如果是,订单重要吗?
. . . 2-2-2-1)如果顺序不重要,则哈希集
...2-2-2)如果是,按照插入顺序或按值排序?
. . . . 2-2-2-2-1)如果订购,LinkedHashSet
. . . . 2-2-2-2-2)如果已排序,则树集
问题内容: 我已经看到了有关根据索引值从中获取对象的其他问题,并且我理解为什么这是不可能的。但是我无法找到一个很好的解释,说明为什么不允许按对象获取,所以我想问一下。 有a作为后盾,因此从中获取对象应该非常简单。现在看来,我将不得不遍历中的每个项目并测试是否相等,这似乎是不必要的。 我可以只使用a,但不需要key:value对,我只需要一个。 例如说我有: 和: 是否因为equals方法用于测试“
问题内容: 我确信这是有充分理由的,但是有人可以解释一下为什么缺少接口或任何类似方法吗? 集合似乎很适合放入东西,但我找不到从其中检索单个项目的优雅方法。 如果我知道我想要第一个项目,则可以使用,但否则似乎必须转换为数组才能在特定索引处检索项目? 从集合中检索数据的适当方法是什么?(除了使用迭代器之外) 我敢肯定,将其排除在API中这一事实意味着有充分的理由不这样做-有人可以启发我吗? 编辑: 这
书上说这段代码在目录被glob匹配的情况下(如node_modules/fs.stat)应该报错,但是我在本地执行没有。 下面代码实现了一个copy的功能,将source directory下的所有文件复制到destination directory。 对这段代码的几点说明: 此处的glob版本为7.2.3,最新版本的glob是基于promise的,不再支持回调。 fs-extra提供了更多的功能
问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和
问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)
当使用Java8流时,获取一个列表、从中创建一个流、处理业务并将其转换回来是很常见的。类似于: 有什么想法吗?