【问题标题】:Merging string-Array / arrayList without using loop合并字符串数组/数组列表而不使用循环
【发布时间】:2014-03-26 13:05:48
【问题描述】:

我试图做类似的事情:

ArrayList<String> getMerged ( String host, String port, String filesToCopy ){
  ArrayList<String> merged = new ArrayList<String>();
  merged.add(host);
  merged.add(port);
  merged.addAll(filesToCopy.split(","));   //which is invalid
  return merged;
}

我想知道我们是否可以添加 filesToCopy.split(",") 的元素而不会产生使用循环的开销。

另外,如果上述操作可以在字符串数组中完成,比如 String[] 合并(如果需要,可以将 filesToCopy 也作为 String[] 传递),在最后,我将把这个arrayList转换成一个数组。

我是 Java 编程新手,所以请不要介意这是一个愚蠢的问题。

【问题讨论】:

  • 有点困惑。 filesToCopy 是一个列表,为什么需要在其中拆分字符串?除非filesToCopy 是一个包含逗号分隔文件名的字符串?也许你应该研究方法的可变参数参数......
  • 我也不确定你想用 split 做什么。 filesToCopy 是一个 ArrayList 那么假设它应该完成什么?向我们展示您使用您不想使用的循环尝试做什么。
  • @DanTemple & Radiodef - 对不起,这是一个错字; filesToCopy 是一个字符串。 “(如果需要,也可以将 filesToCopy 作为 String[] 传递)” - 因为我可以将来自调用者的 arg 作为 filesToCopy.split(",") 传递。
  • 好吧,关于你现在如何拥有代码(提供filesToCopy 作为字符串),你可以将Arrays.asList(filesToCopy.split(","); 放入addAll() 方法中,它应该可以正常工作。
  • @Vnm 我不确定你想做什么。你检查过我的答案吗。如果我的方法都没有用,请更新状态...

标签: java arraylist arrays array-merge


【解决方案1】:

您可以在单个数组中执行此操作:

String[] files = filesToCopy.split(","); // filesToCopy is an ArrayList, so I'm not
                                         // sure how this works; I'm assuming it's
                                         // a typo. Just get the files array somehow
String[] merged = new String[2 + files.length];
merged[0] = host;
merged[1] = port;
for (int i = 2; i < merged.length; i++) {
    merged[i] = files[i-2];
}

或者,没有“循环的开销”:

merged[0] = host;
merged[1] = port;
System.arraycopy(files, 0, merged, 2, files.length);

当然,这仍然使用了“幕后”循环,这是不可避免的。

【讨论】:

  • 是的,我明白,但我想知道它是否比我们自己使用循环更好。就像 C 中的 mem 复制或 sys::copy 一样
  • 我从链接中得到了性能部分的答案:stackoverflow.com/questions/8526907/…
【解决方案2】:

ArrayList.addAll 方法需要一个 Collection 作为参数,所以只需传递 filesToCopy:

String [] getMerged ( String host, String port, ArrayList<String> filesToCopy ){
  ArrayList<String> merged = new ArrayList<String>();
  merged.add(host);
  merged.add(port);
  merged.addAll(filesToCopy); 
  return merged.toArray(new String[merged.size());
}

PS:我只是一个意见,但如果我可以在数组和集合之间进行选择,我总是更喜欢使用集合(列表,集合)。可变尺寸和易于插入是需要考虑的事情。

【讨论】:

    【解决方案3】:

    我不确定您的需求是什么。但我相信以下任何一种方法都一定会对您有所帮助..

    1.用逗号隐藏字符串到ArrayList

    计划:

        import java.util.Arrays;
        ....  
        String name="java,php,c";
        List<String> list=Arrays.asList(name.split(","));
        System.out.println(" "+list);
    

    输出:

        [java, php, c]
    

    2.将ArrayList隐蔽到StringArray

    在这里我们可以将我们在第一种方法中得到的相同的arraylist转换为字符串数组。

    计划:

        String []names=list.toArray(new String[list.size()]);
        for(String s:names){
                System.out.println(""+s);
        }
    

    输出:

        java
        php
        c
    

    3.将ArrayList转换为逗号分隔字符串

    在这里我们可以将我们在第一种方法中得到的相同的arraylist转换为字符串数组。

    为此,您需要将commons-lang3-3.2.1.jar 添加到您的类路径或项目库中。

    您可以下载 commons-lang3-3.2.1.jar (HERE)

    计划:

        import org.apache.commons.lang3.StringUtils;
        .....
        String name=StringUtils.join(list, ",");
        System.out.println("name="+name);
    

    输出:

        name=java,php,c
    

    4.更新程序

    这可能是你需要的方法

    public String[] getMerged(String host, String port, String filesToCopy) {
        String files[] = filesToCopy.split(",");
        String[] merged = new String[(2 + files.length)];
        merged[0] = host;
        merged[1] = port;
        System.arraycopy(files, 0, merged, 2, files.length);
        return merged;
    }
    

    查看这些方法,如果您需要的不是这些方法,请通知我..

    【讨论】:

    • 嗨,Prakash,对于合并的数组,我需要先将两个字符串(比如主机 n 端口)合并,然后将 .split(",") 的内容合并到它。如果不需要 split(),我可以使用我已经知道的“Pablo Lozano”方法。
    猜你喜欢
    • 2016-05-30
    • 2012-10-28
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多