Java 根据条件将1个ArrayList拆分为多个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
['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中实现,您在注释中的提示将非常有用,谢谢!