【问题标题】:Filling Arraylist using recursion in Java在 Java 中使用递归填充 Arraylist
【发布时间】:2018-04-26 11:08:17
【问题描述】:

我正在尝试使用对 getMyClassTypes() 的递归调用来填充列表 myClassTypes。但是每次递归调用该方法时它都会被初始化。而且,我因此失去了一些价值。我知道问题在于在本地声明: List myClassTypes = new ArrayList(); 但是,我不想在类级别声明列表。 这是我正在使用的代码:

private List<MyClassType> getMyClassTypes(final String path) throws SVNException {

    final Collection<SVNDirEntry> svnDirectoryEntries = svnRepository.getDir(path, -1, null, (Collection<SVNDirEntry>) null);
    final Iterator<SVNDirEntry> svnDirectoryEntryIterator = svnDirectoryEntries.iterator();
    final List<MyClassType> myClassTypes = new ArrayList<>();

    while (svnDirectoryEntryIterator.hasNext()) {
        final SVNDirEntry entry = svnDirectoryEntryIterator.next();
        final String fileName = entry.getName();

        if (!path.isEmpty() && path.matches(SUB_DIRECTORY_NAME_PATTERN) && fileName.endsWith(".xml")) {                
            final MyClassType myClassType = new MyClassType(path, fileName);
            myClassTypes.add(myClassType);
        }

        /*
         * Check if the entry is a directory recursively.
         */
        if (someCondition) {
            getMyClassTypes((path.equals("")) ? entry.getName() : path + "/" + entry.getName());
        }
    }
    return myClassTypes;
}

即使在“n 次”递归调用之后,如何管理“myClassTypes”以包含所有值?

【问题讨论】:

  • 你的意思是你会打电话给getMyClassTypesn次?

标签: java list recursion arraylist


【解决方案1】:

List&lt;MyClassType&gt; 实例作为参数传递给方法,而不是在方法中创建它。

这种方式只创建一个ArrayList 实例,您甚至可以将返回类型更改为void

private void getMyClassTypes(final String path, List<MyClassType> myClassTypes) throws SVNException 
{
    final Collection<SVNDirEntry> svnDirectoryEntries = svnRepository.getDir(path, -1, null, (Collection<SVNDirEntry>) null);
    final Iterator<SVNDirEntry> svnDirectoryEntryIterator = svnDirectoryEntries.iterator();

    while (svnDirectoryEntryIterator.hasNext()) {
        final SVNDirEntry entry = svnDirectoryEntryIterator.next();
        final String fileName = entry.getName();

        if (!path.isEmpty() && path.matches(SUB_DIRECTORY_NAME_PATTERN) && fileName.endsWith(".xml")) {                
            final MyClassType myClassType = new MyClassType(path, fileName);
            myClassTypes.add(myClassType);
        }

        /*
         * Check if the entry is a directory recursively.
         */
        if (someCondition) {
            getMyClassTypes((path.equals("")) ? entry.getName() : path + "/" + entry.getName(), myClassTypes);
        }
    }
}

【讨论】:

    【解决方案2】:

    将递归调用的返回值添加到当前myClassTypes中并返回。

    if (someCondition) {
        myClassTypes.addAll(getMyClassTypes((path.equals("")) ? entry.getName() : path + "/" + entry.getName()));
    }
    

    【讨论】:

    • 当您只需要其中一个时,这会创建多个 ArrayList 实例。
    • @Eran True。如果递归深度太长并且被证明会影响性能,那么我们可以按照您的建议将其作为参数传递。
    • @Eran 我觉得这更干净一些(不改变输入参数)
    • @Eran:谢谢你的想法。工作得很好。这是一个很好的解决方案。 (抱歉,由于我在stackoverflow上的级别太低,所以我不允许添加+1来回答)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2022-01-14
    • 2023-03-30
    • 2011-07-17
    相关资源
    最近更新 更多