从 ArrayList<Arraylist<String>> 中获取第一列相等的行
Get rows which have equal first column from ArrayList<Arraylist<String>>
我需要帮助从 ArrayList < Arraylist < String > >
中获取行中第一个元素相等的行
例如,我的列表结构如下所示:
Barcode DepName EventDate EventName
XX0123456XX Dep1 2015-03-30 07:03:01 Sent
XX0123456XX Dep1 2015-03-30 18:51:02 Received
XX0123456XX Dep2 2015-03-31 01:08:04 Archived
XX9999999XX Dep1 2015-03-30 17:22:58 Sent
XX9999999XX Dep3 2015-03-31 12:09:43 Received
XX5555555XX Dep1 2015-03-30 07:03:01 Sent
所以,我想从标记为 "Barcode" 的等式元素中获取 1 个对象,其中包含 EventDetails(DepName、EventDate、EventName)。例如 XX0123456XX 有包含 3 个 EventDetails 对象的列表,XX9999999XX 有包含 2 个 EventDetails 对象的列表,等等。
我怎样才能得到那些行,请帮助我
使用 Map
生成从条形码到行的映射:
Map<String, List<String>> barcodeToRows = new HashMap<>();
for (List<String> item : items) {
String bc = item.get(0);
if (barcodeToRows.containsKey(bc)) {
barcodeToRows.get(bc).add(item);
} else {
List<String> tmpList = new ArrayList<>();
tmpList.add(item)
barcodeToRows.put(bc, tmpList);
}
}
然后要获取条形码的行,您可以执行以下操作:
barcodeToRows.get(bc);
使用 Java 1.8 流。条件:内部列表的元素0必须是条码
public static void main(String[] args) {
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
ArrayList<String> list3 = new ArrayList<String>();
list1.add("XX0123456XX");
list1.add("Dep1");
list1.add("test");
list1.add("Received");
list2.add("XX0123456XX");
list2.add("Dep1");
list2.add("test2");
list2.add("Archived");
list3.add("XX12344XX");
list3.add("Dep2");
list3.add("Test");
list3.add("Sent");
list.add(list1);
list.add(list2);
list.add(list3);
//setup done. the following line is the important one
List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals("XX0123456XX")).collect(Collectors.toList());
//test output
result.forEach(l -> {
l.forEach(s -> System.out.print(s+" "));
System.out.println();
});
}
关于循环的问题。 Stream 将 运行 遍历 List 的所有元素。你不需要循环。不过,您可以创建一个方法。
public List<ArrayList<String>> getResult(List<ArrayList<String>> list, String userSearchInput){
List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals(userSearchInput)).collect(Collectors.toList());
return result;
}
因此,一旦您从用户那里获得了条件,就调用此方法,您得到的结果是一个列表,仅包含列
我需要帮助从 ArrayList < Arraylist < String > >
中获取行中第一个元素相等的行例如,我的列表结构如下所示:
Barcode DepName EventDate EventName
XX0123456XX Dep1 2015-03-30 07:03:01 Sent
XX0123456XX Dep1 2015-03-30 18:51:02 Received
XX0123456XX Dep2 2015-03-31 01:08:04 Archived
XX9999999XX Dep1 2015-03-30 17:22:58 Sent
XX9999999XX Dep3 2015-03-31 12:09:43 Received
XX5555555XX Dep1 2015-03-30 07:03:01 Sent
所以,我想从标记为 "Barcode" 的等式元素中获取 1 个对象,其中包含 EventDetails(DepName、EventDate、EventName)。例如 XX0123456XX 有包含 3 个 EventDetails 对象的列表,XX9999999XX 有包含 2 个 EventDetails 对象的列表,等等。
我怎样才能得到那些行,请帮助我
使用 Map
生成从条形码到行的映射:
Map<String, List<String>> barcodeToRows = new HashMap<>();
for (List<String> item : items) {
String bc = item.get(0);
if (barcodeToRows.containsKey(bc)) {
barcodeToRows.get(bc).add(item);
} else {
List<String> tmpList = new ArrayList<>();
tmpList.add(item)
barcodeToRows.put(bc, tmpList);
}
}
然后要获取条形码的行,您可以执行以下操作:
barcodeToRows.get(bc);
使用 Java 1.8 流。条件:内部列表的元素0必须是条码
public static void main(String[] args) {
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
ArrayList<String> list3 = new ArrayList<String>();
list1.add("XX0123456XX");
list1.add("Dep1");
list1.add("test");
list1.add("Received");
list2.add("XX0123456XX");
list2.add("Dep1");
list2.add("test2");
list2.add("Archived");
list3.add("XX12344XX");
list3.add("Dep2");
list3.add("Test");
list3.add("Sent");
list.add(list1);
list.add(list2);
list.add(list3);
//setup done. the following line is the important one
List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals("XX0123456XX")).collect(Collectors.toList());
//test output
result.forEach(l -> {
l.forEach(s -> System.out.print(s+" "));
System.out.println();
});
}
关于循环的问题。 Stream 将 运行 遍历 List 的所有元素。你不需要循环。不过,您可以创建一个方法。
public List<ArrayList<String>> getResult(List<ArrayList<String>> list, String userSearchInput){
List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals(userSearchInput)).collect(Collectors.toList());
return result;
}
因此,一旦您从用户那里获得了条件,就调用此方法,您得到的结果是一个列表,仅包含列