猿问

用Java中的多个元素替换Collection的元素的最佳方法

我有一个字符串值集合。如果值之一是“ *”,我想用另外3个值代替,例如“ X”,“ Y”和“ Z”。


换句话说,我想将[“ A”,“ B”,“ *”,“ C”]转换为[“ A”,“ B”,“ X”,“ Y”,“ Z”,“ C”]。顺序无关紧要,因此只需删除其中一个并添加其他内容即可。这些是我可以想到的使用示例的方式:


Collection<String> additionalValues = Arrays.asList("X","Y","Z"); // or set or whatever

if (attributes.contains("*")) {

    attributes.remove("*");

    attributes.addAll(additionalValues);

}

或者


attributes.stream()

          .flatMap(val -> "*".equals(val) ? additionalValues.stream() : Stream.of(val))

          .collect(Collectors.toList());

最有效的方法是什么?再说一次,顺序并不重要,理想情况下,我想删除重复项(所以可能是流中的distinct()或HashSet?)。


一只萌萌小番薯
浏览 248回答 3
3回答

蝴蝶不菲

我认为第二个更好。Arrays.asList("X","Y","Z")检索ArrayList即数组。替换其中的值不是很好。在一般情况下,如果您想修改一个集合(例如,*用X,Y和替换Z),请以某种方式创建新集合。请查看LinkedList是否要修改集合本身。使用流:public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {&nbsp; &nbsp; return attributes.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.map(val -> value.equals(val) ? additionalValues.stream() : Stream.of(val))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.flatMap(Function.identity())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toList());}不使用流public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {&nbsp; &nbsp; List<String> res = new LinkedList<>();&nbsp; &nbsp; for (String attribute : attributes) {&nbsp; &nbsp; &nbsp; &nbsp; if (value.equals(attribute))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.addAll(additionalValues);&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.add(attribute);&nbsp; &nbsp; }&nbsp; &nbsp; return res;}演示:List<String> attributes = Arrays.asList("A", "B", "*", "C");List<String> res = replace(attributes, "*", Arrays.asList("X", "Y", "Z"));&nbsp; // ["A", "B", "X", "Y", "Z", "C"]

饮歌长啸

我会以与您的第一种方式非常相似的方式进行操作:if&nbsp;(attributes.remove("*"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;attributes.addAll(additionalValues); &nbsp;&nbsp;&nbsp;&nbsp;}你并不需要一个单独的remove和contains呼叫的正确实施的集合:[&nbsp;Collection.remove(Object)]如果存在,则从此集合中删除指定元素的单个实例(可选操作)。更正式地讲,如果此集合包含一个或多个这样的元素,则删除这样的元素e,使其(o == null?e == null:o.equals(e))。如果此集合包含指定的元素(或者等效地,如果此集合由于调用而更改),则返回true。
随时随地看视频慕课网APP

相关分类

Java
我要回答