首页 > 解决方案 > 搜索对象数组列表的特定属性

问题描述

我有一个对象数组列表ArrayList<Tile> listTile 具有的属性new Tile("colour", value)我想创建一个搜索函数,在其中迭代ColourTile 的每个Value属性和数组列表中每种颜色内的每个属性(例如每个循环的嵌套),有没有简单的方法这样做?

标签: java

解决方案


假设Tileclass 有两个属性 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;
    }
}

推荐阅读