降低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();) }
);
谢谢,
答案 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)
嗯,由于两个事实,没有真正优雅的解决方案:
String
是不可变的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)