簡體   English   中英

用Java中的多個元素替換Collection的元素的最佳方法

[英]Best way to replace an element of a Collection with multiple elements in Java

我有一個字符串值集合。 如果值之一是“ *”,我想用另外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?)。

我會以與您的第一種方式非常相似的方式進行操作:

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

您不需要單獨的removecontains 對正確實現的collection的調用:

[ Collection.remove(Object) ]從此集合中移除指定元素的單個實例( 如果存在) (可選操作)。 更正式地講,如果此集合包含一個或多個這樣的元素,則刪除元素(e == null?e == null:o.equals(e))。 如果此集合包含指定的元素 (或者等效地,如果此集合由於調用而更改),則返回true

我認為第二個更好。 Arrays.asList("X","Y","Z")檢索ArrayList即數組。 替換其中的值不是很好。

在一般情況下,如果您想修改一個集合(例如,將*替換為XYZ ),請以某種方式創建集合。

如果要修改集合本身,請查看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"]

為了獲得最佳性能,並在正確的位置插入替換值,請使用indexOf(o)remove(index)addAll(index, c)

演示版

List<String> attributes = new ArrayList<>(Arrays.asList("A", "B", "*", "C"));
Collection<String> additionalValues = Arrays.asList("X","Y","Z");

int idx = attributes.indexOf("*");
if (idx != -1) {
    attributes.remove(idx);
    attributes.addAll(idx, additionalValues);
}

System.out.println(attributes);

輸出量

[A, B, X, Y, Z, C]

如果順序無關緊要,請使用remove(o)的返回值:

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

輸出量

[A, B, C, X, Y, Z]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM