我如何在自定义对象类型数组列表中搜索?什么是最好和最快的方法
How can i search in a custom object type array list ? whats is best and fastest way
我有数组列表的自定义对象类型,我想搜索一个字符串存在于对象值中,然后我怎样才能找到那个对象
有搜索字符串
您可以尝试这样的操作:
package com.company;
import java.util.ArrayList;
import java.util.List;
public class Test {
private String val;
public Test(String s) {
this.val = s;
}
public static void main(String[] args) {
List<Test> values = new ArrayList<>();
values.add(new Test("one"));
values.add(new Test("two"));
values.add(new Test("three"));
System.out.println(listContains(values, "two"));
System.out.println(listContains(values, "five"));
}
public static boolean listContains(List<Test> customTypeList, String searchedString) {
return customTypeList.stream().anyMatch((v) -> v.val.contains(searchedString));
}
}
如果您正在搜索最快的解决方案并且搜索到的字符串恰好是列表中对象的值(对子字符串不感兴趣),那么您可能希望将对象中的字符串映射到这些对象的引用,如下所示:
(...)
List<Test> values = new ArrayList<>();
values.add(new Test("one"));
values.add(new Test("two"));
values.add(new Test("three"));
Map<String, Test> indices = new HashMap<>();
for (Test v : values) {
indices.put(v.val, v);
}
System.out.println(indices.containsKey("two"));
System.out.println(indices.containsKey("five"));
// or...
System.out.println(indices.keySet().contains("two"));
System.out.println(indices.keySet().contains("five"));
(...)
重要提示:无论何时更改列表内容,您都需要更新索引。请注意,在这种情况下,对象内的字符串值必须是这些对象的有效键(唯一值)。示例:
public static void main(String[] args) {
List<Test> values = new ArrayList<>();
Map<String, Test> indices = new HashMap<>();
addToList(values, indices, new Test("one"));
addToList(values, indices, new Test("two"));
addToList(values, indices, new Test("three"));
System.out.println(indices.keySet().contains("two"));
System.out.println(indices.keySet().contains("five"));
removeFromList(values, indices, "two");
System.out.println(indices.keySet().contains("two"));
}
private static void addToList(List<Test> values, Map<String, Test> indices, Test item) {
values.add(item);
indices.put(item.val, item);
}
private static void removeFromList(List<Test> values, Map<String, Test> indices, String key) {
Test item = indices.remove(key);
values.remove(item);
}
我有数组列表的自定义对象类型,我想搜索一个字符串存在于对象值中,然后我怎样才能找到那个对象 有搜索字符串
您可以尝试这样的操作:
package com.company;
import java.util.ArrayList;
import java.util.List;
public class Test {
private String val;
public Test(String s) {
this.val = s;
}
public static void main(String[] args) {
List<Test> values = new ArrayList<>();
values.add(new Test("one"));
values.add(new Test("two"));
values.add(new Test("three"));
System.out.println(listContains(values, "two"));
System.out.println(listContains(values, "five"));
}
public static boolean listContains(List<Test> customTypeList, String searchedString) {
return customTypeList.stream().anyMatch((v) -> v.val.contains(searchedString));
}
}
如果您正在搜索最快的解决方案并且搜索到的字符串恰好是列表中对象的值(对子字符串不感兴趣),那么您可能希望将对象中的字符串映射到这些对象的引用,如下所示:
(...)
List<Test> values = new ArrayList<>();
values.add(new Test("one"));
values.add(new Test("two"));
values.add(new Test("three"));
Map<String, Test> indices = new HashMap<>();
for (Test v : values) {
indices.put(v.val, v);
}
System.out.println(indices.containsKey("two"));
System.out.println(indices.containsKey("five"));
// or...
System.out.println(indices.keySet().contains("two"));
System.out.println(indices.keySet().contains("five"));
(...)
重要提示:无论何时更改列表内容,您都需要更新索引。请注意,在这种情况下,对象内的字符串值必须是这些对象的有效键(唯一值)。示例:
public static void main(String[] args) {
List<Test> values = new ArrayList<>();
Map<String, Test> indices = new HashMap<>();
addToList(values, indices, new Test("one"));
addToList(values, indices, new Test("two"));
addToList(values, indices, new Test("three"));
System.out.println(indices.keySet().contains("two"));
System.out.println(indices.keySet().contains("five"));
removeFromList(values, indices, "two");
System.out.println(indices.keySet().contains("two"));
}
private static void addToList(List<Test> values, Map<String, Test> indices, Test item) {
values.add(item);
indices.put(item.val, item);
}
private static void removeFromList(List<Test> values, Map<String, Test> indices, String key) {
Test item = indices.remove(key);
values.remove(item);
}