You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何按特定格式(映射/表格)打印街道居民家庭信息?

街道居民家庭排版实现方案

我来帮你梳理这个街道居民排版的实现方案,完全贴合你提到的规则:

核心规则回顾

  • 家庭判定:x1和x2值完全相同的居民属于同一家庭(比如someone4和someone5满足s4_x1 = s5_x1 && s4_x2 == s5_x2)
  • 平行列展示:区间重叠的家庭需要放在平行的列中
  • 同起始排序:若多个家庭x1起始值相同,房屋面积(x2-x1+1)最大的家庭放在左侧
  • 格式要求:每个家庭占据的位置用冒号分隔

实现步骤与代码示例

以下用C#代码为例,基于你提到的Street类结构完成需求:

基础类定义

先对应你的数据结构定义基础类:

// 街道类,包含家庭列表
public class Street
{
    public List<Family> Families { get; set; } = new List<Family>();
}

// 家庭类,包含居民列表及x1/x2区间
public class Family
{
    public List<Resident> Residents { get; set; } = new List<Resident>();
    public int X1 { get; set; }
    public int X2 { get; set; }
    // 计算房屋面积
    public int Area => X2 - X1 + 1;
}

// 居民类
public class Resident
{
    public string Name { get; set; }
    public int X1 { get; set; }
    public int X2 { get; set; }
}

核心排版逻辑

public static void PrintStreetLayout(Street street)
{
    // 1. 第一步:将居民按x1/x2分组为家庭
    var groupedFamilies = street.Families
        .SelectMany(family => family.Residents) // 取出所有居民
        .GroupBy(resident => new { resident.X1, resident.X2 }) // 按x1/x2分组
        .Select(group => new Family
        {
            X1 = group.Key.X1,
            X2 = group.Key.X2,
            Residents = group.ToList()
        })
        .ToList();

    // 2. 第二步:对x1相同的家庭,按面积降序排序(确保大的在左)
    var sortedByX1AndArea = groupedFamilies
        .GroupBy(f => f.X1)
        .SelectMany(g => g.OrderByDescending(f => f.Area))
        .ToList();

    // 3. 第三步:分配平行列,处理区间重叠
    var columns = new List<List<Family>>();
    foreach (var family in sortedByX1AndArea)
    {
        bool placed = false;
        // 遍历现有列,找最后一个家庭不与当前家庭重叠的列
        foreach (var column in columns)
        {
            var lastInColumn = column.Last();
            if (lastInColumn.X2 < family.X1)
            {
                column.Add(family);
                placed = true;
                break;
            }
        }
        // 没有找到合适的列,新建一列
        if (!placed)
        {
            columns.Add(new List<Family> { family });
        }
    }

    // 4. 第四步:按要求格式输出
    Console.WriteLine("街道居民排版结果:");
    foreach (var column in columns)
    {
        var familyEntries = column.Select(f => 
            $"家庭[{string.Join(", ", f.Residents.Select(r => r.Name))}] 区间({f.X1}-{f.X2}) 面积:{f.Area}");
        Console.WriteLine(string.Join(" : ", familyEntries));
    }
}

代码说明

  • 家庭分组:通过GroupBy按(X1,X2)键将居民聚合为家庭,确保同一家庭的居民x1/x2完全一致
  • 排序逻辑:对同x1的家庭按面积降序排列,保证大户型在左侧
  • 平行列分配:遍历家庭,优先放入不重叠的列,重叠则新建列,实现重叠家庭平行展示
  • 格式输出:用冒号分隔同一列的家庭,清晰展示每个家庭的信息

内容的提问来源于stack exchange,提问作者Psycarlo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:18:14