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

时间:2010-04-15 11:00:08

标签: 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());
}

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

这样的事情会很好:

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

谢谢,

11 个答案:

答案 0 :(得分:84)

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

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

答案 1 :(得分:26)

答案 2 :(得分:13)

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

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

答案 3 :(得分:4)

嗯,由于两个事实,没有真正优雅的解决方案:

    Java中的
  • String是不可变的
  • Java没有像函数式语言那样提供真正优秀的map(f, list)函数。

渐近地说,你不能比现在的方法获得更好的运行时间。您必须使用toLowerCase()创建一个新字符串,您需要在列表上自行迭代并生成每个新的小写字符串,并将其替换为现有字符串。

答案 4 :(得分:2)

尝试CollectionUtils#transform in Commons Collections获取就地解决方案,或Collections2#transform in Guava如果您需要实时视图。

答案 5 :(得分:1)

这可能更快:

for(int i=0,l=strings.size();i<l;++i)
{
  strings.set(i, strings.get(i).toLowerCase());
}

答案 6 :(得分:0)

如果您将字符串更改为Set,我认为不可能在适当的位置进行操作(不创建另一个Collection)。这是因为您只能使用迭代器或每个循环迭代Set,并且在执行此操作时无法插入新对象(它会抛出异常)

答案 7 :(得分:0)

参考接受的(Matthew T. Staebler)解决方案中的ListIterator方法。如何使用ListIterator比这里的方法更好?

public static Set<String> replace(List<String> strings) {
    Set<String> set = new HashSet<>();
    for (String s: strings)
        set.add(s.toLowerCase());
    return set;
}

答案 8 :(得分:0)

我一直在寻找类似的东西,但因为我的 ArrayList 对象未被声明为 GENERIC 并且它可以作为原始< strong>列表从某个地方输入对象。我刚刚得到一个 ArrayList 对象“_products”。所以,我所做的就是下面提到的,它对我来说非常有用::

List<String> dbProducts = _products;
    for(int i = 0; i<dbProducts.size(); i++) {
        dbProducts.add(dbProducts.get(i).toLowerCase());         
    }

也就是说,我首先使用了我的 _products 并创建了一个 GENERIC 列表对象(因为我只获得了相同的字符串)然后我将应用到了LowerCase由于非通用 ArrayList 对象,以前无效的列表元素的()方法。

我们在这里使用的 toLowerCase() 方法是 String 类。

  

String java.lang.String.toLowerCase()

不是 ArrayList 对象类。

如果错误,请更正。 JAVA的新手寻求指导。 :)

答案 9 :(得分:0)

使用JAVA 8并行流变得更快

List<String> output= new ArrayList<>();
List<String> input= new ArrayList<>();
input.add("A");
input.add("B");
input.add("C");
input.add("D");
input.stream().parallel().map((item) -> item.toLowerCase())
            .collect(Collectors.toCollection(() -> output));

答案 10 :(得分:0)

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

strings.replaceAll(String::toLowerCase)