java~无法在if语句中限定条件

时间:2018-01-26 13:02:36

标签: java generics singly-linked-list

我正在使用带有泛型的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();
}

2 个答案:

答案 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。以下是两个应该解决您的问题的修复

  1. 简单修复 - 对代码进行最少的更改以使其正常工作(更好的是下面的#2)

    @Override
    public boolean equals(Object o) {
        Cycle cycle = (Cycle)o;
        return this.getPrice() == cycle.getPrice();
    }
    
  2. 首选等于方法

    @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;
    }
    
  3. 您的IDE可能能够为您创建equals()。当您创建用于集合,地图等的equals()时,最好也创建hashCode()。