小写列表或集合的每个元素的最有效方法是什么?
我对清单的想法:
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();) } );
谢谢,
对于列表,这似乎是一个非常干净的解决方案。它应该允许使用特定的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)); }