如何有效地小写集合的每个元素?

Chr*_*ris 39 java string

降低List或Set的每个元素的最有效方法是什么?

我对列表的想法:

final List<String> strings = new ArrayList<String>();
strings.add("HELLO");
strings.add("WORLD");

for(int i=0,l=strings.size();i<l;++i)
{
  strings.add(strings.remove(0).toLowerCase());
}
Run Code Online (Sandbox Code Playgroud)

有更好,更快的方式吗?这个例子对于一个Set怎么样?由于目前没有方法将操作应用于Set(或List)的每个元素,是否可以在不创建额外临时Set的情况下完成?

像这样的东西会很好:

Set<String> strings = new HashSet<String>();
strings.apply(
  function (element)
  { this.replace(element, element.toLowerCase();) } 
);
Run Code Online (Sandbox Code Playgroud)

谢谢,

Igo*_* G. 87

另一个解决方案,但使用Java 8:

List<String> result = strings.stream()
                             .map(String::toLowerCase)
                             .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Mat*_*ler 28

这似乎是一个相当干净的列表解决方案.它应该允许使用特定的List实现来提供一个实现,该实现对于列表的遍历(线性时间)和字符串的替换 - 在恒定时间内是最佳的.

public static void replace(List<String> strings)
{
    ListIterator<String> iterator = strings.listIterator();
    while (iterator.hasNext())
    {
        iterator.set(iterator.next().toLowerCase());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我能想到的最好的套装.正如其他人所说,由于多种原因,操作不能在集合中就地执行.小写字符串可能需要放在集合中的不同位置,而不是它要替换的字符串.此外,如果小写字符串与已经添加的另一个小写字符串相同(例如,"HELLO"和"Hello"都将产生"hello"),则根本不会将小写字符串添加到集合中,这将是只被添加到集合中一次).

public static void replace(Set<String> strings)
{
    String[] stringsArray = strings.toArray(new String[0]);
    for (int i=0; i<stringsArray.length; ++i)
    {
        stringsArray[i] = stringsArray[i].toLowerCase();
    }
    strings.clear();
    strings.addAll(Arrays.asList(stringsArray));
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Java 8 中,第一个示例可以简化为“strings.replaceAll(String::toLowerCase);”,您可以使用“Arrays.asList(stringsArray).replaceAll(String::toLowerCase); 对第二个示例执行类似的操作。 ` (2认同)

Rom*_*man 13

您可以使用Google Collections执行此操作:

    Collection<String> lowerCaseStrings = Collections2.transform(strings,
        new Function<String, String>() {
            public String apply(String str) {
                return str.toLowerCase();
            }
        }
    );
Run Code Online (Sandbox Code Playgroud)


Ari*_*yak 5

如果您可以更改输入列表,这是实现它的另一种方法。

strings.replaceAll(String::toLowerCase)