使用方法在 ArrayLists 中循环
Posted
技术标签:
【中文标题】使用方法在 ArrayLists 中循环【英文标题】:Looping in ArrayLists with a Method 【发布时间】:2013-03-02 01:39:44 【问题描述】:在很多帮助下,我开发了一种制作字谜然后将它们添加到ArrayList
中的方法。
public void f(String s, String anagram, ArrayList<String> array)
if(s.length() == 0)
array.add(anagram);
return;
for(int i = 0 ; i < s.length() ; i++)
char l = s.charAt(i);
anagram = anagram + l;
s = s.substring(0, i) + s.substring(i+l, s.length());
f(s,anagram,array);
问题是当我尝试使用此函数在一个循环中创建ArrayList
s 时,将String
s 从一个ArrayList
添加到另一个,我收到一条错误消息,说我不能使用 void,并且方法f()
无效。
List<String> Lists = new ArrayList<String>(); //makes new array list
for(String List : words)
//takes values from old array list
List.trim();
Lists.add(f(List,"",new ArrayList<String>())); //this is where it doesn't work
让我再次澄清一下:
我想使用这个函数将ArrayList
s 的字谜插入另一个ArrayList
的每个位置。字谜列表源自从一个列表读取到另一个列表的String
s。我尝试将方法更改为静态但不起作用,我还删除了方法中的return;
一次,但这也不能解决它。
我怎样才能让这整件事发挥作用?
【问题讨论】:
words
是从哪里定义的?
List
是一个糟糕的变量名,因为它会隐藏类型名称。为清楚起见,将您的 for 循环替换为 for (String word : words)
,然后采纳以下建议。
单词words
是正在读取的ArrayList
的名称。我将List
更改为fList
并将ArrayList
名称更改为fLists
【参考方案1】:
发生错误是因为方法f()
是void
,意思是:它没有返回任何可以添加到ArrayList
的值。
调用f()
的答案存储在作为参数传递给f
的ArrayList
中,您可能应该使用that ArrayList
将其所有元素添加到@987654328 @。像这样的:
List<String> lists = new ArrayList<String>();
for (String list : words)
list.trim();
ArrayList<String> answer = new ArrayList<String>();
f(list, "", answer);
lists.addAll(answer);
【讨论】:
如果我错了,请纠正我,但是将new ArrayList<String>()
作为函数参数传递不是“按值传递”而不是“按引用传递”吗?函数f()
将被调用,并带有一个在父函数中永远不会受到影响的空白列表
在Java中,所有的参数都是按值传递的,但是一个Object的值是一个对象引用,所以对ArrayList的改变是对外可见的。
@TheCapn 在 Java 中,所有参数都是按值传递的,语言中没有按引用传递的语义。是的,列表 will 在方法内部被修改,并且将包含方法返回后的所有值,因为 arraylist 引用 inside 方法和一个 外部该方法指向完全相同的对象
不是听起来懒惰或不聪明,但你能告诉我或者至少给我一些视觉效果吗?我是一个java菜鸟。
我真的不确定如何实施您告诉我的内容,但每个人都认为这是很好的建议。我只需要更多细节。我是 java 新手,所以如果我看不到它的样子或关闭它,在哪里做什么会有点混乱。【参考方案2】:
您的 F 方法标头需要如下所示:
public String f(String s, String anagram, ArrayList<String> array)
然后您返回一个字符串值以添加到您正在使用的 ArrayList 中。
【讨论】:
这行不通,因为f
可能需要返回多个字符串。
猜猜你可以做 String[] 然后【参考方案3】:
f()
的函数定义显示void
类型的返回值。因此,查看您正在尝试执行此操作的代码:
Lists.add(void);
这显然是非法的。
您的选择确实是在更大的范围内声明 ArrayList。
private List<String> anagrams;
public void f(String s, String anagram)
...
anagrams.add(anagram);
...
....
for(String List : words)
//takes values from old array list
anagrams = new ArrayList<String>();
List.trim();
f(list,"");
Lists.add(anagrams); //this is where it doesn't work
【讨论】:
我不能这样做,因为它会不断改变 List anagrams,因为它不是静态的。我需要制作多个列表。以上是关于使用方法在 ArrayLists 中循环的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Java 不为 ArrayLists 实现 last() 方法? [关闭]
在处理 ArrayLists 时,我用啥代替 charAt?