降低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());
}
Run Code Online (Sandbox Code Playgroud)
有更好,更快的方式吗?这个例子对于一个Set怎么样?由于目前没有方法将操作应用于Set(或List)的每个元素,是否可以在不创建额外临时Set的情况下完成?
像这样的东西会很好:
Set<String> strings = new HashSet<String>();
strings.apply(
function (element)
{ this.replace(element, element.toLowerCase();) }
);
Run Code Online (Sandbox Code Playgroud)
谢谢,
Igo*_* G. 87
另一个解决方案,但使用Java 8:
List<String> result = strings.stream()
.map(String::toLowerCase)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Mat*_*ler 28
这似乎是一个相当干净的列表解决方案.它应该允许使用特定的List实现来提供一个实现,该实现对于列表的遍历(线性时间)和字符串的替换 - 在恒定时间内是最佳的.
public static void replace(List<String> strings)
{
ListIterator<String> iterator = strings.listIterator();
while (iterator.hasNext())
{
iterator.set(iterator.next().toLowerCase());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我能想到的最好的套装.正如其他人所说,由于多种原因,操作不能在集合中就地执行.小写字符串可能需要放在集合中的不同位置,而不是它要替换的字符串.此外,如果小写字符串与已经添加的另一个小写字符串相同(例如,"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));
}
Run Code Online (Sandbox Code Playgroud)
Rom*_*man 13
您可以使用Google Collections执行此操作:
Collection<String> lowerCaseStrings = Collections2.transform(strings,
new Function<String, String>() {
public String apply(String str) {
return str.toLowerCase();
}
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60563 次 |
| 最近记录: |