将变量作为方法参数传递
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' 的字符串更简单。
我正在处理链表代码并想访问 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' 的字符串更简单。