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

2022-08-31 23:46:06

将 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());
}

有没有更好,更快的方法?对于 Set,此示例将如下所示?由于目前没有将操作应用于集(或列表)的每个元素的方法,是否可以在不创建其他临时集的情况下完成此操作?

像这样的东西会很好:

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

谢谢


答案 1

这是另一个解决方案,但使用Java 8及更高版本:

List<String> result = strings.stream()
                             .map(String::toLowerCase)
                             .collect(Collectors.toList());

答案 2

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

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

这是我能想到的最好的套装。正如其他人所说,由于多种原因,无法在集合中就地执行该操作。小写的字符串可能需要放置在集合中与它所替换的字符串不同的位置。此外,如果小写字符串与已添加的另一个小写字符串相同,则可能根本不会将其添加到集合中(例如,“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));
}