当前位置: 首页 > 知识库问答 >
问题:

基于Java中的多个参数获取列表的子列表

仲孙夕
2023-03-14

我有一个物品清单。每个对象都有一个级别属性(int 1、2或3)、一个城市属性(“New York”、“Milan”、“London”)和泛型字符串FamilyID。列表中对象的数量是随机的。我需要创建一个子列表(或任何其他集合/数据结构),它是由列表中的第一个对象组成的,具有级别和城市的任意组合(我不关心FamilyID)。

希望用一个例子让我的要求更清楚:

InitialList: [1, Milan, ID1][1, London, ID1][1, Milan, ID5][2, Lodon, ID1][2, London, ID6],[3, New York, ID2]

ExpectedOutput: [1, Milan, ID1][1, London, ID1][2, London, ID1][3, New York, ID2]

输出集合是具有(level,City)任意组合的第一个对象的列表。

共有2个答案

范高刚
2023-03-14

您需要在这里基于以下伪逻辑编写一个定制的比较器:

  1. 如果城市列表中的城市相同,则只包括列表中的第一个城市(忽略第二个数组)
  2. 如果级别相同而城市不同,则包含级别和城市只能按(字符串的)降序组合。
  3. 增加级别,对于增加的级别,再次进行级别和城市的比较,与步骤1和步骤2相同。
  4. 对于字符串比较,可以使用API String1.compareTo(string2),并根据compareTo方法返回的负值、零值或正值,返回第一个字母是小于、等于还是大于。
  5. 然后,新列表是一个与所需输出类似的筛选列表。
田兴旺
2023-03-14

在这种情况下,您可以将收集器一起使用。它将是这样的:

initialList.stream().collect(Collectors.toMap(City::key, city -> city, (f, s) -> f))

完整代码示例:

public class Stack {

public static void main(String[] args) {
    List<City> initialList = List.of(new City(1, "Milan", "ID1"),
            new City(1, "London", "ID1"),
            new City(1, "Milan", "ID5"),
            new City(2, "London", "ID1"),
            new City(2, "London", "ID6"),
            new City(3, "New York", "ID2"));

    final ArrayList<City> expectedOutput = new ArrayList<>(initialList.stream().collect(Collectors.toMap(City::key, city -> city, (f, s) -> f)).values());

    System.out.println(expectedOutput);
}


private static class City {

    private final long level;
    private final String city;
    private final String family;

    public City(long level, String city, String family) {
        this.level = level;
        this.city = city;
        this.family = family;
    }

    public String key() {
        return level + "_" + city;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", City.class.getSimpleName() + "[", "]")
                .add("level=" + level)
                .add("city='" + city + "'")
                .add("family='" + family + "'")
                .toString();
    }
}
 类似资料:
  • 问题内容: 请考虑下表: 在这里,我要找回它们是具有独特组合的记录,和。如果存在两个或多个这些字段的唯一组合,我想选择其中的第一个。 作为上表数据的示例,我需要的输出是 (由于记录3和4具有相同的组合,我想只记录3,因为它是第一次出现) 我可以使用一条SQL语句执行此操作吗? 问题答案:

  • 在上面的示例中,子集列表有23个元素。对于gridSize为12,子集列表中的23个元素应该分布在12个分区中,因此在这种情况下,每个分区应该有2个子集列表中的元素。 这个问题与spring批处理分区有关。列表中的整数实际上是spring批处理程序要处理的用户ID。有些用户比其他用户需要更多的处理时间。因此在分区过程中可能发生的情况是,某些分区可能包含比其他分区占用更多处理时间的更多用户。这会导致

  • 尝试使用这个资源:仍然不走运,我如何从Java8 Stream的一些类属性中获得列表?

  • 这是我无法解决的问题: 我有一个Clients表和一个box表 每个框属于一个客户端 我需要显示所有客户机,其中完成了属于每个客户机的所有框,这基本上就是where box。status=“已完成”。 我很难掌握如何在一个查询中完成这一切: -获取所有客户端 -获取属于每个客户端的所有框的计数($总框) -获取属于每个客户端的完成框的计数($完成框) -计算如果只显示客户端的位置 我用这个来得到C

  • 问题内容: 我的字符串列表如下所示: 我的期望是,我想检查父列表是否包含 序列 子列表,然后基于子列表获取父列表中的开始索引和结束索引。 从上面的示例: 我尝试使用方法,但它不在乎列表项的顺序,因此无法从此方法获取开始和结束索引。 我正在寻找最快的方法,因为我的列表中有很多数据,而且我必须从许多输入字符串中进行搜索。 任何帮助,将不胜感激! 更新 : 我需要获取所有子列表的索引都包含在父列表中。例

  • 我想要获取与列名相关的列值,如在policy no string中获取TXT_Policy_no等,因为excel工作表的值可以满足要求,所以我想要读取基于列名的值,以更加安全。 我的java代码: