我正在使用带有泛型的Singly_Linked_List并存储类循环的对象,并且循环只有一个参数价格,因此getElement()将返回价格。但是list.contains(walk.getElement())总是返回false。我在toString方法中遇到麻烦。整个实施如下。
@IBAction func myButton(sender: AnyObject) {
sender.setTitle("This is example text one", for:[])
sender.setTitle("This is example text two", for: .normal)
}
整个清单实施:
public String toString() {
ArrayList<E> list = new ArrayList<>();
Node<E> walk = head;
while (walk != null) {
if (!list.contains(walk.getElement()))
list.add(walk.getElement());
walk = walk.getNext();
}
return list.toString();
}
}
循环类实施:
import java.util.ArrayList;
public class Singly_Linked_List<E> {
class Node<E> {
private E element;
private Node<E> next;
Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
void setNext(Node<E> next) {
this.next = next;
}
E getElement() {
return element;
}
Node<E> getNext() {
return next;
}
}
private Node<E> tail;
private Node<E> head;
private int size = 0;
Singly_Linked_List() {
}
int getSize() {
return size;
}
boolean isEmpty() {
return getSize() == 0;
}
void addFirst(E element) {
head = new Node<E>(element, head);
if (isEmpty())
tail = head;
size++;
}
void addLast(E element) {
Node<E> node = new Node<E>(element, null);
if (isEmpty())
head = node;
else
tail.setNext(node);
tail = node;
size++;
}
E first() {
if (isEmpty())
return null;
return head.getElement();
}
E last() {
if (isEmpty())
return null;
return tail.getElement();
}
E removeFirst() {
if (isEmpty()) return null;
E answer = head.getElement();
head = head.getNext();
if (head == tail)
tail = null;
size--;
return answer;
}
@Override
public String toString() {
ArrayList<E> list = new ArrayList<>();
Node<E> walk = head;
while (walk != null) {
if (!list.contains(walk.getElement()))
list.add(walk.getElement());
walk = walk.getNext();
}
return list.toString();
}
答案 0 :(得分:0)
你在toString方法中做的第一件事就是将一个局部变量列表初始化为一个新的ArrayList。这意味着每个toString调用开始时列表为空。这就是为什么list.contains(...)总是返回false。
如果您的目标是打印出唯一元素,最好使用Set而不是List。类似的东西:
public String toString() {
Set<E> s = new HashSet<>();
Node<E> walk = head;
while (walk != null) {
// No need to check if element exists. Set can only contain
// unique elements
s.add(walk.getElement());
walk = walk.getNext();
}
return s.toString();
}
不要忘记为Node类实现良好的equals / hashcode方法。唯一性基于此。
答案 1 :(得分:0)
您在列表中遇到意外行为(重复)的原因(并为此设置)是因为您的equals()方法不正确。 Java要求您将Object传递给equals。以下是两个应该解决您的问题的修复
简单修复 - 对代码进行最少的更改以使其正常工作(更好的是下面的#2)
@Override
public boolean equals(Object o) {
Cycle cycle = (Cycle)o;
return this.getPrice() == cycle.getPrice();
}
首选等于方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cycle other = (Cycle) obj;
if (price != other.price)
return false;
return true;
}
您的IDE可能能够为您创建equals()。当您创建用于集合,地图等的equals()时,最好也创建hashCode()。