java - 搜索对象数组列表的特定属性
问题描述
我有一个对象数组列表ArrayList<Tile> list
Tile 具有的属性new Tile("colour", value)
我想创建一个搜索函数,在其中迭代Colour
Tile 的每个Value
属性和数组列表中每种颜色内的每个属性(例如每个循环的嵌套),有没有简单的方法这样做?
解决方案
假设Tile
class 有两个属性 aString
colour
和 an int
value
。它有一个toString
(java.lang.Object class
的覆盖方法),如下所示:
@Override public String toString() {
return colour + ":" + value;
}
制作一些瓷砖:
Tile t1 = new Tile("red", 7); // constructor takes a colour and a value
Tile t2 = new Tile("red", 2);
Tile t3 = new Tile("blue", 9);
Tile t4 = new Tile("white", 17);
Tile t5 = new Tile("blue", 3);
Tile t6 = new Tile("red", 15);
Tile t7 = new Tile("white", 10);
场景一:
该函数将Tile
对象列表和String
颜色作为输入,并返回具有输入颜色(及其值)的所有图块。有两种方法可以做到这一点,它们以两种方法显示:
private static List<Tile> getTilesWithColor1(List<Tile> tilesList, String searchColor) {
return tilesList.stream()
.filter(tile -> tile.getColour().equals(searchColor))
.collect(Collectors.toList());
}
private static List<Tile> getTilesWithColor2(List<Tile> tilesList, String searchColor) {
List<Tile> result = new ArrayList<>();
for (Tile t : tilesList) {
if (t.getColour().equals(searchColor)) {
result.add(t);
}
}
return result;
}
- 输入:
tilesList
,colour="red"
- 输出(两种方法相同):
[red:7, red:2, red:15]
我想创建一个搜索功能,在其中迭代 Tile 的每个 Color 属性和 arraylist 中每个颜色内的每个 Value 属性(就像每个循环的嵌套),有没有简单的方法来做到这一点?
可以更改此功能以添加其他条件或过滤器以获得所需的结果。
场景二:
获取所有颜色及其值:
private static Map<String, List<Integer>> getTileColorsAndValues(List<Tile> tilesList) {
return tilesList.stream()
.collect(Collectors.groupingBy(Tile::getColour,
Collectors.mapping(Tile::getValue, Collectors.toList())));
}
- 输入:
tilesList
- 输出:
{red=[7, 2, 15], white=[17, 10], blue=[9, 3]}
请注意,可以从生成的地图中获得像这样的“红色”图块中的值:
List<Integer> valuesList = map.get("red");
场景 3:
按颜色获取所有图块:
private static Map<String, List<Tile>> getTilesByColorsAndValues(List<Tile> tilesList) {
return tilesList.stream()
.collect(Collectors.groupingBy(Tile::getColour));
}
- 输入:
tilesList
- 输出:
{red=[red:7, red:2, red:15], white=[white:17, white:10], blue=[blue:9, blue:3]}
请注意,可以从生成的地图中获得像这样的“红色”图块中的图块:
List<Tile> tilesList = map.get("red");
示例代码:
import java.util.*;
import java.util.stream.*;
import java.util.function.*;
public class TilesExample {
public static void main(String [] args) {
Tile t1 = new Tile("red", 7);
Tile t2 = new Tile("red", 2);
Tile t3 = new Tile("blue", 9);
Tile t4 = new Tile("white", 17);
Tile t5 = new Tile("blue", 3);
Tile t6 = new Tile("red", 15);
Tile t7 = new Tile("white", 10);
List<Tile> tilesList = Arrays.asList(t1, t2, t3, t4, t5, t6, t7);
System.out.println(getTilesWithColor1(tilesList, "red"));
System.out.println(getTilesWithColor2(tilesList, "red"));
System.out.println(getTileColorsAndValues(tilesList));
System.out.println(getTilesByColorsAndValues(tilesList));
}
private static Map<String, List<Tile>> getTilesByColorsAndValues(List<Tile> tilesList) {
return tilesList.stream()
.collect(Collectors.groupingBy(Tile::getColour));
}
private static Map<String, List<Integer>> getTileColorsAndValues(List<Tile> tilesList) {
return tilesList.stream()
.collect(Collectors.groupingBy(Tile::getColour,
Collectors.mapping(Tile::getValue, Collectors.toList())));
}
private static List<Tile> getTilesWithColor1(List<Tile> tilesList, String searchColor) {
return tilesList.stream()
.filter(tile -> tile.getColour().equals(searchColor))
.collect(Collectors.toList());
}
private static List<Tile> getTilesWithColor2(List<Tile> tilesList, String searchColor) {
List<Tile> result = new ArrayList<>();
for (Tile t : tilesList) {
if (t.getColour().equals(searchColor)) {
result.add(t);
}
}
return result;
}
}
推荐阅读
- python - 使用 Python 在我的家庭网络上获取设备的全名
- python - 在python中按列合并多个文本文件
- angular - 如何将 Angular 组件设置为 GridStack 小部件的内容?
- node.js - 更新猫鼬文档中的数组
- sql - 通过 Python 连接到 SQL Server
- r - Tidyverse 问题:为什么这个由 tribble 创建的 tibble 列不被识别?
- python - 当我 pip install pickle 我面临这个错误错误:需要 Microsoft Visual C++ 14.0 或更高版本。使用“Microsoft C++ Build Tools”获取它:
- python - 如何访问硒中的多个文本框
- chef-infra - 在厨师检查中实现跳过条件
- android - 撰写中的分享按钮