- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
下面显示的代码确实输出:
[b]
[a, b]
但是我希望它在输出中打印两行相同的行。
import java.util.*;
public class Test{
static void test(String... abc) {
Set<String> s = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
s.addAll(Arrays.asList("a", "b"));
s.removeAll(Arrays.asList(abc));
System.out.println(s);
}
public static void main(String[] args) {
test("A");
test("A", "C");
}
}
规范明确指出 removeAll
"Removes all this collection's elements that are also contained in the specified collection."
所以根据我的理解,当前的行为是不可预测的。请帮助我理解这一点
最佳答案
您只阅读了部分文档。您忘记了 TreeSet
中的一个重要段落:
Note that the ordering maintained by a set (whether or not an explicit comparator is provided) must be consistent with equals if it is to correctly implement the
Set
interface. (SeeComparable
orComparator
for a precise definition of consistent with equals.) This is so because the Set interface is defined in terms of the equals operation, but aTreeSet
instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal. The behavior of a set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface.
现在 removeAll
实现来自 AbstractSet
并利用 equals
方法。根据您的代码,您将得到 "a".equals("A")
不是 true
,因此即使您提供了一个管理比较器,元素也不被视为相等它们在 TreeSet
本身中使用时。如果您尝试使用包装器,那么问题就会消失:
import java.util.*;
import java.lang.*;
class Test
{
static class StringWrapper implements Comparable<StringWrapper>
{
public final String string;
public StringWrapper(String string)
{
this.string = string;
}
@Override public boolean equals(Object o)
{
return o instanceof StringWrapper &&
((StringWrapper)o).string.compareToIgnoreCase(string) == 0;
}
@Override public int compareTo(StringWrapper other) {
return string.compareToIgnoreCase(other.string);
}
@Override public String toString() { return string; }
}
static void test(StringWrapper... abc)
{
Set<StringWrapper> s = new TreeSet<>();
s.addAll(Arrays.asList(new StringWrapper("a"), new StringWrapper("b")));
s.removeAll(Arrays.asList(abc));
System.out.println(s);
}
public static void main(String[] args)
{
test(new StringWrapper("A"));
test(new StringWrapper("A"), new StringWrapper("C"));
}
}
这是因为您现在在对象的 equals
和 compareTo
之间提供了一致的实现,因此您永远不会在如何将对象添加到有序集合和集合的所有抽象行为如何使用它们。
这在一般情况下是正确的,Java 代码的一种三规则:如果你实现 compareTo
或 equals
或 hashCode
你应该始终实现所有这些以避免标准集合出现问题(即使 hashCode 不太重要,除非您在任何散列集合中使用这些对象)。这在 Java 文档中多次指定。
关于java - AbstractSet.removeAll() 方法无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121742/
我不确定 groovy 中的 removeAll 是如何工作的,但我希望它会返回 [40289454470ea94601470ea977d00018] def list = ['40289454470
我在使用 Netbeans 制作的 Java 应用程序中遇到了奇怪的问题。这是一款内存卡游戏。主类是一个 JFrame,它保存相同大小的面板。面板通过网格布局进行分割,每个单元格都包含一张卡片,另一个
List vAllBatchList = getAllBatchCollection().toList(); //Has 700k records List vKeepableBatchCollect
我编写了一个通用的 Partition 类(分区是将一个集合划分为不相交的子集,称为部分)。在内部这是一个 Map和一个 Map> ,其中整数是零件的标签。例如partition.getLabel(T
我有两个自创建类对象的数组列表。比较后,我从两者中删除了公共(public)对象,并准备了获取公共(public)元素的方法。找到公共(public)元素后,我通过调用 removeAll() 方法删
我想要编写一段代码,它接受一个列表列表,将其拆分为 9 个子列表,并从每个子列表中的所有列表中删除数字。但是,当我的代码运行时,它会从所有列表中删除数字,而不仅仅是从原始列表中获取的部分 for (i
我是 Linq 的新手。根据我的理解,LINQ 应该只用于查询而不用于修改集合或数据库等。 如果是这样,微软为什么要提供 RemoveAll() 扩展? 据我所知,RemoveAll() 修改集合。
有人可以解释为什么以下内容无法按我的预期工作吗? 按下“应该”按钮会导致显示仅包含(空的)JScrollPane,即输入字段和按钮应该消失。但是,它们会一直保留到调整组件大小为止... public
我有一个超过 400 行的列表。每行看起来都类似于:example-example123 我想删除“-”之后的所有内容,这样我只剩下开头部分:example123任何帮助将不胜感激。 最佳答案 像这样
我有两个 for 循环来从列表中删除项目。我正在为这些循环寻找等效的 LINQ 语句 for (Int32 i = points.Count - 1; i >= 0; i--) { for (
我有一个页面,将 View 模型绑定(bind)到 jQuery UI 对话框内的 HTML 表。 当用户关闭对话框时,我想删除 viewmodel observableArray 中绑定(bind)
myGenericList.RemoveAll(x => (x.StudentName == "bad student")); 效果很好,但绑定(bind)列表没有此方法。如何为绑定(bind)列表创
我使用数组列表来查找两个字符串(即 str2 和 str3)之间的差异。当我使用下面的代码时,它工作正常并返回预期的输出。但当我更换时 str2 = #19, 6th cross, 7th main
我有一个小问题,数组列表中的元素没有被删除。这是一个数组列表。这是我的代码: package net.lucrecious.armorconstruct.helpers; import java.ut
我有成员类的简单ArrayList: ArrayList mGroupMembers = new ArrayList<>(); ArrayList mFriends = new ArrayList<>
我预计结果如下,但实际上没有。尽管当我尝试使用字符串而不是项目对象时它起作用了。我想知道为什么会这样以及如何编码以获得预期结果。谢谢。 EXPECTED -----------------------
我有以下代码: ActionListener listenerComboVehicle = new ActionListener() { @Override public void a
(我已经根据“removeall where”或“removeall two argument predicate”的关键字做了尽可能多的搜索,但运气不佳,所以这里开始) 问题是我有一个对象列表(Wa
在通过 NHibernate 检索集合时,我遇到了无法使用 .RemoveAll 的问题。 我有一个名为 Order 的实体,我通过 NHibernate 保留它。 Order 有很多 OrderIt
我有两个列表,我们称它们为列表 A 和列表 B。这两个列表都包含名称并且没有重复项(它们是唯一值)。列表 B 中的每个名称都可以在列表 A 中找到。我想找出列表 B 中缺少哪些名称,以便将这些缺少的名
我是一名优秀的程序员,十分优秀!