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

新手上路,请多包涵

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

谢谢,

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 461
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));
}

原文由 Matthew T. Staebler 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

原文由 Igor G. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题