为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2021-05-07 14:13:53
我有一个字符串值集合。如果值之一是“ *”,我想用另外3个值代替,例如“ X”,“ Y”和“ Z”。换句话说,我想将[“ A”,“ B”,“ *”,“ C”]转换为[“ A”,“ B”,“ X”,“ Y”,“ Z”,“ C”]。顺序无关紧要,因此只需删除其中一个并添加其他内容即可。这些是我可以想到的使用示例的方式:Collection<String> additionalValues = Arrays.asList("X","Y","Z"); // or set or whateverif (attributes.contains("*")) {    attributes.remove("*");    attributes.addAll(additionalValues);}或者attributes.stream()          .flatMap(val -> "*".equals(val) ? additionalValues.stream() : Stream.of(val))          .collect(Collectors.toList());最有效的方法是什么?再说一次,顺序并不重要,理想情况下,我想删除重复项(所以可能是流中的distinct()或HashSet?)。
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我认为第二个更好。Arrays.asList("X","Y","Z")检索ArrayList即数组。替换其中的值不是很好。


在一般情况下,如果您想修改一个集合(例如,*用X,Y和替换Z),请以某种方式创建新集合。


请查看LinkedList是否要修改集合本身。


使用流:


public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {

    return attributes.stream()

                     .map(val -> value.equals(val) ? additionalValues.stream() : Stream.of(val))

                     .flatMap(Function.identity())

                     .collect(Collectors.toList());

}

不使用流


public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {

    List<String> res = new LinkedList<>();


    for (String attribute : attributes) {

        if (value.equals(attribute))

            res.addAll(additionalValues);

        else

            res.add(attribute);

    }


    return res;

}

演示:


List<String> attributes = Arrays.asList("A", "B", "*", "C");

List<String> res = replace(attributes, "*", Arrays.asList("X", "Y", "Z"));  // ["A", "B", "X", "Y", "Z", "C"]



查看完整回答
反对 回复 2021-05-26
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我会以与您的第一种方式非常相似的方式进行操作:

if (attributes.remove("*")) {
    attributes.addAll(additionalValues);
    }

你并不需要一个单独的removecontains呼叫的正确实施的集合

Collection.remove(Object)]如果存在从此集合中删除指定元素的单个实例(可选操作)。更正式地讲,如果此集合包含一个或多个这样的元素,则删除这样的元素e,使其(o == null?e == null:o.equals(e))。如果此集合包含指定的元素(或者等效地,如果此集合由于调用而更改),则返回true


查看完整回答
反对 回复 2021-05-26
  • 3 回答
  • 0 关注
  • 247 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信