使用方法在 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);
    

问题是当我尝试使用此函数在一个循环中创建ArrayLists 时,将Strings 从一个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
        

让我再次澄清一下: 我想使用这个函数将ArrayLists 的字谜插入另一个ArrayList 的每个位置。字谜列表源自从一个列表读取到另一个列表的Strings。我尝试将方法更改为静态但不起作用,我还删除了方法中的return; 一次,但这也不能解决它。

我怎样才能让这整件事发挥作用?

【问题讨论】:

words 是从哪里定义的? List 是一个糟糕的变量名,因为它会隐藏类型名称。为清楚起见,将您的 for 循环替换为 for (String word : words),然后采纳以下建议。 单词words 是正在读取的ArrayList 的名称。我将List 更改为fList 并将ArrayList 名称更改为fLists 【参考方案1】:

发生错误是因为方法f()void,意思是:它没有返回任何可以添加到ArrayList的值。

调用f() 的答案存储在作为参数传递给fArrayList 中,您可能应该使用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&lt;String&gt;() 作为函数参数传递不是“按值传递”而不是“按引用传递”吗?函数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

在处理 ArrayLists 时,我用啥代替 charAt?

使用ArrayLists和HashMaps在Java中进行紧凑拆分和新行操作

使用ArrayLists时出现奇怪的NPE行为

在 ArrayLists () 中放入啥 [关闭]