【问题标题】:How can I change a LinkedList from a void method (Java)如何从 void 方法(Java)更改 LinkedList
【发布时间】:2021-03-26 03:27:09
【问题描述】:

这看起来很简单,但我不太明白为什么这不起作用。

我想反转我的 LinkedList 中的元素,我有一个工作方法,但我不能返回值,因为我的教授希望它是一个 void 方法。我该怎么办?

import java.util.LinkedList;
public class ListUtil {
    public static void reverse(LinkedList<String> strings) {
        LinkedList<String> reverseLinkedList = new LinkedList<>();
        for(int i = strings.size() - 1; i >= 0; i--) {
            reverseLinkedList.add(strings.get(i));
        }
        strings = reverseLinkedList;
        System.out.println(strings);
    }
}
import java.util.LinkedList;

public class ReverseTester {
    public static void main(String[] args) {
        LinkedList<String> employeeNames = new LinkedList<>();
        employeeNames.addLast("Dick");
        employeeNames.addLast("Harry");
        employeeNames.addLast("Romeo");
        employeeNames.addLast("Tom");
        
        ListUtil.reverse(employeeNames);
        System.out.println(employeeNames);
        System.out.println("Expected: [Tom, Romeo, Harry, Dick]");
    }
}

在我的 ListUtil 类中,它确实反转了列表,但不返回值(因为它是 void)但我不知道如何在 ReverseTester 类中设置employeeName。

我知道这可能非常简单,但我一生都无法解决这个问题,非常感谢任何帮助。

【问题讨论】:

  • 就地反转它?
  • @Dave Newton 我希望我可以,这会更容易,或者即使我可以让该方法返回一个链接列表,但我的教授可悲的是不希望这样
  • 也许将您当前的 LinkedList 复制/克隆到新的 LinkedList,然后在原来的 LinkedList 中进行反向操作,这样做您不需要返回,因为原来的会被反转
  • @HưngChu 你是说将 LinkedList 复制到另一个类吗?

标签: java linked-list void


【解决方案1】:

清空并重新填充现有列表,而不是替换它。

public static void reverse(LinkedList<String> strings) {
    List<String> temp = new ArrayList<>(strings);   // Copy the contents of the original list. Pass the original list to constructor of our duplicate list.
    strings.clear();                                // Empty the original list.
    for (String e : temp)
        strings.addFirst(e);                        // Refill the original list using elements from our duplicate list.
}

或者干脆

public static void reverse(LinkedList<String> strings) {
    Collections.reverse(strings);
}

【讨论】:

  • 谢谢,这很好用,但是这如何改变我的测试器类中的列表而我的原始代码没有?
【解决方案2】:

非原始 Java 对象通过引用存储,因此您无需从 ListUtil::reverse 返回任何内容。对函数中对象所做的任何更改都将反映在 ReverseTester.java 中。发生这种情况是因为,非原始 Java 对象是通过引用存储的。基本上,您的代码完全符合您的要求。您创建一个 LinkedList,用项目填充它,然后反转这些项目。

不过,System.out.println(employeeNames); 会有问题。因为那只会打印对象的正式名称,而不是它的内容。如果你想用 Java 打印列表的内容,你可以这样做:

for (String name : employeeNames) {
    System.out.println(t);
}

这是我的第一个答案,如果我不够清楚,请提出任何问题!

【讨论】:

  • System.out.println(employeeNames); 是我的教授想要的,并希望它反向打印出列表。不过这很有帮助,我不知道非原始对象以及它们是如何工作的。我在上面的答案中使用了 for 循环,这确实反映了我的测试人员类。
  • 非常明确的答案!我对 Java 还比较陌生,只是不明白 thinks 工作背后的一些原因。你清理了一切!
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多