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
相关产品推荐
相关产品推荐

