Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据条件将1个ArrayList拆分为多个ArrayList_Java_Algorithm - Fatal编程技术网

Java 根据条件将1个ArrayList拆分为多个ArrayList

Java 根据条件将1个ArrayList拆分为多个ArrayList,java,algorithm,Java,Algorithm,我有一个包含字符串的大数组列表。我想根据元素满足的条件拆分它。例如,如果ArrayList包含字符串,则可以是字符串长度。最有效(不是最简单)的方法是什么 ['a', 'bc', 'defe', 'dsa', 'bb'] 之后将导致: ['a'], ['bc', 'bb'], ['dsa'], ['defe'] 最有效的方法是只迭代原始列表一次。您要做的是创建存储桶并添加到这些存储桶中 public class Q1 { public static void main(St

我有一个包含字符串的大数组列表。我想根据元素满足的条件拆分它。例如,如果ArrayList包含字符串,则可以是字符串长度。最有效(不是最简单)的方法是什么

['a', 'bc', 'defe', 'dsa', 'bb'] 
之后将导致:

['a'], ['bc', 'bb'], ['dsa'], ['defe']

最有效的方法是只迭代原始列表一次。您要做的是创建存储桶并添加到这些存储桶中

public class Q1 {    
    public static void main(String[] args) {
        String[] original = {"a","bc","defe","dsa","bb"};

        List<String> originalValues = new ArrayList<String>(Arrays.asList(original));
        Map<Integer, List<String>> orderedValues = new HashMap<Integer, List<String>>();

        Iterator<String> it = originalValues.iterator();
        while (it.hasNext()) {
            String currentElement = it.next();
            int length = currentElement.length();
            if(!orderedValues.containsKey(length)) {
                orderedValues.put(length, new ArrayList<String>());
            }
            orderedValues.get(length).add(currentElement);
        }
        System.out.println(orderedValues.values());
    }
}
公共类Q1{
公共静态void main(字符串[]args){
String[]original={“a”、“bc”、“defe”、“dsa”、“bb”};
List originalValues=newarraylist(Arrays.asList(original));
Map orderedValues=新HashMap();
迭代器it=originalValues.Iterator();
while(it.hasNext()){
字符串currentElement=it.next();
int length=currentElement.length();
如果(!orderedValues.containsKey(长度)){
put(长度,新ArrayList());
}
orderedValues.get(长度).add(currentElement);
}
System.out.println(orderedValues.values());
}
}

您可能会尝试使用数组数组而不是映射,并使用字符串的大小作为数组位置的索引,但是您需要注意没有特定长度字符串的情况。想象一下,在原始列表中只有一个字符串,但它有100个字符。您将有99个空位置和一个位于位置100的数组中的字符串。

使用Java 8流执行此操作既简单又高效:

Collection output=input.stream()
.collect(收集器.groupingBy(字符串::长度))
.values();
如果使用此输入运行它:

List input=Arrays.asList(“a”、“bc”、“defe”、“dsa”、“bb”);
您将获得以下输出:

[[a]、[bc、bb]、[dsa]、[defe]]
非流版本也会做同样的事情,即构建一个
Map
,其中
V
是您的值类型(例如,在您的情况下
String
),而
K
是分组值的类型(例如,长度的
整数

自己动手(如中所示)在运行时可能会稍微更有效率,但可能根本不重要

如果继续使用Java 8,这将是:

Map Map=newhashmap();
for(字符串值:输入)
computeIfAbsent(value.length(),ArrayList::new).add(value);
集合输出=map.values();
对于早期版本的Java,您不能使用
computeIfAbsent()
,因此:

Map Map=newhashmap();
for(字符串值:输入){
整数长度=Integer.valueOf(value.length());//框仅一次
List=map.get(长度);
if(list==null)
put(长度,list=newarraylist());
列表。添加(值);
}
集合输出=map.values();

如果不指定条件:没有可能的优化,您将不得不使用暴力解决。您可以稍微优化相应的数据结构,但如果不知道匹配是通过什么属性完成的,则无法优化匹配本身。条件是什么?为什么
bc
bb
组合在一起,而
dsa
defe
却不是呢?@ike\u love它遵循问题文本中给出的示例:它们按字符串长度分组。在Java 8中,您可以用
computeIfAbsent(length,ArrayList::new)
替换
get(length)
,消除
if
语句。--另外,为什么要使用迭代器
while
循环,而不是更简单的增强型
for
循环总之,这将您的循环减少到
for(String-value:originalValues){orderedValues.computeIfAbsent(value.length(),ArrayList::new).add(value);}
我试图使它更通用和兼容,但是如果他在Java 8中实现,您在注释中的提示将非常有用,谢谢!