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

如何为List中X值处于指定范围的对象批量赋值极值均值?

通用解决方案:分组处理排序后的对象列表

核心思路

因为列表已经按X属性排序,我们可以通过一次遍历完成分组:

  • 从第一个元素开始,将连续满足「当前元素X与组首元素X的差值≤指定阈值」的对象归为同一组
  • 对每个组,计算组内X的最小值和最大值的均值,批量替换组内所有对象的X属性(Y、Z保持不变)

代码实现

首先定义数据对象类(如果已有可跳过):

public class DataPoint
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}

处理方法实现:

// 传入已按X排序的对象列表,以及X值的分组阈值
public void GroupAndAdjustXValues(List<DataPoint> sortedPoints, double rangeThreshold)
{
    if (sortedPoints == null || sortedPoints.Count <= 1)
        return;

    int groupStartIdx = 0;

    // 遍历列表,划分连续组
    for (int i = 1; i < sortedPoints.Count; i++)
    {
        // 当前元素与组首元素的X差超过阈值,触发组处理
        if (sortedPoints[i].X - sortedPoints[groupStartIdx].X > rangeThreshold)
        {
            ProcessSingleGroup(sortedPoints, groupStartIdx, i - 1);
            groupStartIdx = i; // 更新新组的起始索引
        }
    }

    // 处理最后一个未完成的组
    ProcessSingleGroup(sortedPoints, groupStartIdx, sortedPoints.Count - 1);
}

// 处理单个分组:计算均值并替换X值
private void ProcessSingleGroup(List<DataPoint> points, int startIdx, int endIdx)
{
    // 单元素组无需处理
    if (startIdx == endIdx)
        return;

    double minX = points[startIdx].X;
    double maxX = points[endIdx].X;
    double targetX = (minX + maxX) / 2;

    // 批量替换组内所有对象的X属性
    for (int i = startIdx; i <= endIdx; i++)
    {
        points[i].X = targetX;
    }
}

方案优势

  • 通用性:支持任意数量元素的分组,无需硬编码组大小限制
  • 高效性:仅需两次线性遍历(分组+替换),时间复杂度为O(n),适配大数据量场景
  • 逻辑清晰:分组与处理逻辑分离,代码易维护、易扩展

示例验证

以你提供的DPlace3示例(阈值设为10):

  • 组[2010,2010,2020]的minX=2010,maxX=2020,均值为2015,与示例预期一致
  • 组[5050,5060]的均值为(5050+5060)/2=5055,同样符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:53:17