【问题标题】:Looping in ArrayLists with a Method使用方法在 ArrayLists 中循环
【发布时间】: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

标签: java methods multidimensional-array arraylist anagram


【解决方案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,因为它不是静态的。我需要制作多个列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多