我基于 TreeSet 创建了自己的 Collection,但我在现有测试中遇到了问题:它看不到元素
I made my own Collection based on TreeSet but I have troubles with existing test: it doesn't see elements
这是我的collection。在这里,我尝试使用特殊的 Comparator 实现我自己的实现,该 Comparator 按其绝对值对 Integer 元素进行排序。
class SortedByAbsoluteValueIntegerSet extends TreeSet {
private TreeSet<Integer> mySet;
public SortedByAbsoluteValueIntegerSet() {
mySet = new TreeSet<Integer>(Comparator.comparing(Math::abs));
}
@Override
public boolean add(Object o) {
mySet.add((Integer) o);
return true;
}
@Override
public boolean addAll(Collection c) {
for (Object o : c) {
mySet.add((Integer) o);
}
return true;
}
public Iterator<Integer> iterator() {
return mySet.iterator();
}
(和其他方法)
主要class。除了 toString() 方法之外,一切似乎都正常工作。当我在没有 lambda 的情况下覆盖此方法时,它会起作用。但!此方法正在测试中,我不能更改它。我只是将它复制到 Main class 以试图了解问题所在。我想解决的问题是 SortedByAbsoluteValueIntegerSet class.
中的某个地方
public static void main(String[] args) {
Set<Integer> set = new SortedByAbsoluteValueIntegerSet();
Arrays.asList(1, 3, 5, 7, 9).forEach(set::add);
set.addAll(Arrays.asList(-2, -4, -6, -8, -10));
System.out.println("set.size() = " + set.size()); //OUTPUT:"set.size() = 10"
System.out.println("set = " + set); //OUTPUT:"set = [-10, -8, -6, -4, -2, 1, 3, 5, 7, 9]"
System.out.println("toString(set) = " + toString(set)); //OUTPUT:"toString(set) = "
}
private static String toString(final Collection<Integer> collection) {
return String.join(" ", collection.stream()
.map(i -> Integer.toString(i))
.toArray(String[]::new));
}
这是另一个行之有效的认识。那有什么区别呢?
private static String toString(final Collection<Integer> collection) {
List<String> list = new ArrayList<>();
for (Integer i : collection) {
String s = Integer.toString(i);
list.add(s);
}
return String.join(" ", list.toArray(new String[0]));
}
您似乎还没有完全理解 toString() 方法。此方法应该在您的 SortedByAbsoluteValueIntegerSet 中 class 并且 必须 是 public 并且 不是 私有的。
也许这个 link 可以帮助您更好地理解 toString() 方法:
https://www.javatpoint.com/understanding-toString()-method
您不应该扩展具有 TreeSet
字段的 TreeSet 和 。一个或另一个,但两者都没有意义。
这可能实际上是导致您的问题的原因:您有两个不同的 TreeSet
与每个 SortedByAbsoluteValueIntegerSet
相关联,一个是您要添加的,另一个是 toString()
越来越不一样了。
改为扩展 AbstractSet
。
这是我的collection。在这里,我尝试使用特殊的 Comparator 实现我自己的实现,该 Comparator 按其绝对值对 Integer 元素进行排序。
class SortedByAbsoluteValueIntegerSet extends TreeSet {
private TreeSet<Integer> mySet;
public SortedByAbsoluteValueIntegerSet() {
mySet = new TreeSet<Integer>(Comparator.comparing(Math::abs));
}
@Override
public boolean add(Object o) {
mySet.add((Integer) o);
return true;
}
@Override
public boolean addAll(Collection c) {
for (Object o : c) {
mySet.add((Integer) o);
}
return true;
}
public Iterator<Integer> iterator() {
return mySet.iterator();
}
(和其他方法)
主要class。除了 toString() 方法之外,一切似乎都正常工作。当我在没有 lambda 的情况下覆盖此方法时,它会起作用。但!此方法正在测试中,我不能更改它。我只是将它复制到 Main class 以试图了解问题所在。我想解决的问题是 SortedByAbsoluteValueIntegerSet class.
中的某个地方public static void main(String[] args) {
Set<Integer> set = new SortedByAbsoluteValueIntegerSet();
Arrays.asList(1, 3, 5, 7, 9).forEach(set::add);
set.addAll(Arrays.asList(-2, -4, -6, -8, -10));
System.out.println("set.size() = " + set.size()); //OUTPUT:"set.size() = 10"
System.out.println("set = " + set); //OUTPUT:"set = [-10, -8, -6, -4, -2, 1, 3, 5, 7, 9]"
System.out.println("toString(set) = " + toString(set)); //OUTPUT:"toString(set) = "
}
private static String toString(final Collection<Integer> collection) {
return String.join(" ", collection.stream()
.map(i -> Integer.toString(i))
.toArray(String[]::new));
}
这是另一个行之有效的认识。那有什么区别呢?
private static String toString(final Collection<Integer> collection) {
List<String> list = new ArrayList<>();
for (Integer i : collection) {
String s = Integer.toString(i);
list.add(s);
}
return String.join(" ", list.toArray(new String[0]));
}
您似乎还没有完全理解 toString() 方法。此方法应该在您的 SortedByAbsoluteValueIntegerSet 中 class 并且 必须 是 public 并且 不是 私有的。
也许这个 link 可以帮助您更好地理解 toString() 方法:
https://www.javatpoint.com/understanding-toString()-method
您不应该扩展具有 TreeSet
字段的 TreeSet 和 。一个或另一个,但两者都没有意义。
这可能实际上是导致您的问题的原因:您有两个不同的 TreeSet
与每个 SortedByAbsoluteValueIntegerSet
相关联,一个是您要添加的,另一个是 toString()
越来越不一样了。
改为扩展 AbstractSet
。