将变量作为方法参数传递

Passing variable as method argument

我正在处理链表代码并想访问 head.next.next.data。有没有一种方法可以将 .next.next.data 存储到变量 x 中,以便我可以调用 head.x 并检索结果(前提是我在列表中填充了数据)?我想实施

public class CustomSOL<E> implements SOL<E>  
{
    private static class customNode<E>
    {
        private customNode<E> next;
        private E data;

        public customNode(E dataItem)
        {
            this.data = dataItem;
            this.next = null;
        }

        private customNode(E dataItem, customNode<E> nodeRef)
        {
            this.data = dataItem;
            this.next = nodeRef;
        }
    }

    private customNode<E> head;
    private int size;

    public CustomSOL()
    {
        head = null;
        size = 0;
    }


    public void solLookup(int amount)
    {
        String s = "next";
        StringBuilder sb = new StringBuilder(14);
        for(int i = 0; i < amount; i++)
            sb.append(".").append(s);

        System.out.println(head.s.data);
    }
}

如果我有

        CustomSOL<String> list = new CustomSOL<String>();
        list.solAdd("Apple");
        list.solAdd("Orange");
        list.solAdd("Banana");
        list.solAdd("Strawberry");
        list.solAdd("Papaya");

我打电话给 list.solLookup(3):

String s = "next.next.next";   
System.out.println(head.s.data);

我想看到 Strawberry 打印出来,显然不会,因为 s 是字符串。但是有没有办法,就像 javascript 和 PHP 有可变函数一样,用变量 s 替换所有那些下一次调用?我使用字符串是因为我可以使用 solLookup 中的 amount 参数来创建适当的下一个调用符号。谢谢!

假设链表这样实现:

class List<T> {
    static class Head<T> {
        public T value;
        public Head<T> next;

        public Head(T value) {
            this.value = value;
        }
    }

    public Head<T> head;
}

你可以这样使用它:

List<String> list = new List<>();

list.head = new List.Head<>("a");
list.head.next = new List.Head<>("b");

System.out.println(list.head.next.value);

有很多方法可以改善这一点,但您明白了。

head.next.next.data(大概)是对某些数据的引用。 Java 编译器将该短语转换为可执行代码以获取您想要的数据。

".next.next.data" 只是程序中的一系列 Unicode 字符,无论是按字面意思呈现还是在运行时构建。 (在简单的编程中)不可能将其转换为对某些数据的运行时引用,这些数据恰好与字符串中的字符相似。这样做是 Java 编译器的工作,编译器在您的程序运行之前就已经完成了它的工作。

有一些高级技术 ("reflection"),但我不会以我认为是您的专业水平向您推荐它们。

要获得第 k 级对象,您只需将列表向下迭代 'k' 次:

public Node get(int k) {
    Node n = head;
    while (k > 0) {
       n = n.next;  // or n.next() if need be
       k--;
    }
    return n;
}

这比构建包含 'k' 次 'next' 的字符串更简单。