好的,我对 Java 编程比较陌生,但以前有 C++ 经验。我想在数组中搜索特定项目,但是如果有多个相同的特定项目怎么办?最好使用临时数组将所有找到的项目存储在数组中并返回临时数组吗?
注意:我正在尝试通过内存管理和速度找到最好的方法。而且它不适合家庭工作:)
好的,我对 Java 编程比较陌生,但以前有 C++ 经验。我想在数组中搜索特定项目,但是如果有多个相同的特定项目怎么办?最好使用临时数组将所有找到的项目存储在数组中并返回临时数组吗?
注意:我正在尝试通过内存管理和速度找到最好的方法。而且它不适合家庭工作:)
如果您能够跳过 Java,那么在 Scala 中会容易得多:
scala> val a = Array(4, 6, 8, 9, 4, 2, 4, 2)
a: Array[Int] = Array(4, 6, 8, 9, 4, 2, 4, 2)
scala> a.filter(_ == 4)
res0: Array[Int] = Array(4, 4, 4)
使用 apache commons lib,解决了很多问题。如果要按谓词过滤并选择子数组,请使用此选项
CollectionUtils.filter(
Arrays.asList(new Integer[] {1,2,3,4,5}),
new Predicate() {
public boolean evaluate(final Object object) {
return ((Integer) object) > 2;
}
}
);
如果您想选择项目,请使用
CollectionUtils.select(Collection inputCollection, Predicate predicate)
使用真正的 java 方式 - 可导航集和地图
NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive);
只需使用番石榴库作为最简单的解决方案:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Iterables.html 或 http://docs.guava-libraries.googlecode.com/git/javadoc/com/ google/common/collect/Collections2.html
只需使用ArrayList
. 例子:
/** Returns all strings starting with the letter a.*/
public static List<String> getStartsWithA(String[] strs) {
List<String> ret = new ArrayList<String>();
for (String s: strs) {
if (s.startsWith("a") || s.startsWith("A")) {
ret.add(s);
}
}
return ret;
}
ArrayList
的内部数组将随着需要更多空间而动态增长。
我会使用像 HashMap 这样的“即用型”实现。你说“搜索”,所以我相信你有一个搜索键(在我的建议中是字符串),你可以在它下面存储你的数据(例如一个整数)。
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
void storeValue(final String key, final Integer value) {
List<Integer> l = this.map.get(key);
if (l == null) {
synchronized (this.map) {
if (l == null) {
l = new Vector<Integer>();
this.map.put(key, l);
}
}
}
l.add(value);
}
List<Integer> searchByKey(final String key) {
return this.map.get(key);
}
有了这个,您可以存储多个整数@一个键。当然,您可以存储除整数以外的其他对象。