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

问题描述 投票:0回答:14

将列表或集合中每个元素小写的最有效方法是什么?

我的清单想法:

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

谢谢,

java string lowercase
14个回答
129
投票

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

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

36
投票

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

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

13
投票

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

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

6
投票

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

strings.replaceAll(String::toLowerCase)


4
投票

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

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

渐近地讲,您无法获得比当前方法更好的运行时间。您必须使用

toLowerCase()
创建一个新字符串,并且您需要自己迭代列表并生成每个新的小写字符串,并将其替换为现有字符串。


2
投票

尝试使用 Commons Collections 中的 CollectionUtils#transform 来获取就地解决方案,或者如果您需要实时视图,则尝试使用 Guava 中的Collections2#transform。


1
投票

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



0
投票


0
投票

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



0
投票

ArrayList 对象没有声明为 GENERIC 并且它可以从某个地方作为原始 List 类型对象使用。我刚刚得到一个 ArrayList 对象“_products”。所以,我所做的如下所述,它对我来说非常有效:: List<String> dbProducts = _products; for(int i = 0; i<dbProducts.size(); i++) { dbProducts.add(dbProducts.get(i).toLowerCase()); }

也就是说,我首先使用可用的 
_products

并制作了一个 GENERIC 列表对象(因为我只获得相同的字符串),然后我在列表元素上应用了 toLowerCase() 方法,该方法以前不起作用,因为非泛型 ArrayList 对象。 我们这里使用的方法

toLowerCase()属于String类。

字符串 java.lang.String.toLowerCase()

不属于
ArrayList

Object 类。 如有错误请指正。 JAVA新手求指导。 :)


0
投票

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));



0
投票
streams

来表示集合中每个元素的 小写 List<String> groupNamesList = new ArrayList<>(); groupNamesList.add("GroupOne"); groupNamesList.add("GroupTwo"); groupNamesList.add("GroupThree"); groupNamesList = groupNamesList.stream().map(groupName -> groupName.toLowerCase()).collect(Collectors.toList());

输出:

[groupone,grouptwo,groupthree]



0
投票


0
投票

val originalList = arrayListOf("apple", "banana", "cherry")

val upperCaseList = originalList.map { it.toUpperCase() }

对于小写字母

val originalList = arrayListOf("Apple", "Banana", "Cherry")

val lowerCaseList = originalList.map { it.toLowerCase() }

    

© www.soinside.com 2019 - 2024. All rights reserved.