Java 将数组中的空值转换为现有值的平均值

Java 将数组中的空值转换为现有值的平均值,java,arrays,algorithm,null,Java,Arrays,Algorithm,Null,好的,我有一个带有一些值的随机数组: Integer[] array = {null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null} 我想用最接近的两个现有数组值的平均值替换所有null值。 例如:前两个null值需要替换为数字5({null,null,5,…变为{5,5,5,…) 下一个示例:{…,22,null,null,null,98,…}应该变成:{…,22,60,60,60,98,…};所有三个null值都将

好的,我有一个带有一些值的随机数组:

Integer[] array = {null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null}
我想用最接近的两个现有数组值的平均值替换所有
null
值。 例如:前两个
null
值需要替换为数字
5
{null,null,5,…
变为
{5,5,5,…

下一个示例:
{…,22,null,null,null,98,…}
应该变成:
{…,22,60,60,60,98,…}
;所有三个
null
值都将替换为
22
98
(22+98)/2
)的平均值

最后一个示例:
{…,23,null}
应变为
{…,23,23}
null
替换为
23
,因为它是数组的最后一个元素

有人知道如何为这个问题编写算法吗

  • 确定null的所有序列(存储开始和结束索引 (每个序列的编号)
  • 确定每个元素的边框元素 顺序和计算平均值(确保处理额外的情况 阵列的开始和结束(正确)
  • 将null替换为 计算值

  • 假设这是在
    ArrayList
    上完成的:

    //迭代所有值
    
    对于(int i=0;i一个不同的可能、更简单但可能效率更低的解决方案:

  • 对于每个空值,检查左值和右值 a、 如果两者都是数字,则取平均值 b、 如果一个为空,一个为数字,则将中间值设置为值,另一个为空
  • 重复此操作,直到没有空值为止
  • 它是如何工作的?

    {null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null}
    {null,5   ,5,111,21,21,  22,  22,null,98  ,98,25,47,24  ,1,23,23  }
    {5   ,5   ,5,111,21,21,  22,  22,60  ,98  ,98,25,47,24  ,1,23,23  }
    
    这些值的平均值将是相同的,并且算法更简单

    优势

    • 无需任何修改即可处理开始/结束空值
    • 所需内存更少
    缺点

    • 做点不一样的事
    • 可能需要多次迭代
    • 在悲观的情况下,将需要更多的时间
      • 以下是我的看法:

        public static void fill(Integer[] newarr, Integer[] arr, int index) {
            if (arr[index] != null) {
                newarr[index] = arr[index];
                return;
            }
        
            Integer a = null, b = null;
        
            int i = index;
            while (i < arr.length - 1 && (a = arr[++i]) == null);
        
            i = index;
            while (i > 1 && (b = arr[--i]) == null);
        
            newarr[index] = (a == null) ? b : (b == null) ? a : (a + b) / 2;
        }
        
        公共静态空白填充(整数[]newarr、整数[]arr、整数索引){
        如果(arr[index]!=null){
        newarr[index]=arr[index];
        返回;
        }
        整数a=null,b=null;
        int i=指数;
        而(i1&(b=arr[--i])==null);
        newarr[index]=(a==null)?b:(b==null)?a:(a+b)/2;
        }
        
        然后:

        Integer[]arr={null,null,51111,21,null,22,null,null,null,
        98,25,47,null,1,23,null};
        整数[]newarr=新整数[arr.length];
        对于(int i=0;i
        [5, 5, 5, 111, 21, 21, 22, 60, 60, 60, 98, 25, 47, 24, 1, 23, 23]
        为什么要将前两个空值替换为5,而不是最接近的两个现有数组值的平均值,即5和111?@jwpat7:“两个最近的”应该理解为分别在空值的左侧和右侧取的两个最接近的值,我假设。@haylem可能,可能不是…问题根本不够清楚。很抱歉,回答太晚了。当数组以空值开始时,您将用右侧的第一个现有值替换它们,因为无法计算e如果空值的左右两侧没有现有值,则为空值的平均值。空值的两侧必须都有整数值。错误的算法:
        22,null,null,null,98
        应替换为
        22,60,60,60,98
        ,而不是
        22,22,60,98
        。来自OP:“{…22,null,null,null,98…”应改为:{…22,60,60,60,98…}”@m0skit0你读过我的帖子吗?我在回答中说了。你说了什么?你的回答不是对所问问题的回答?@Dariusz:这主意不错,需要多做一点工作。谢谢你的努力!我不喜欢编辑其他人的答案,因为这些东西实际上不是错误。
        public static void fill(Integer[] newarr, Integer[] arr, int index) {
            if (arr[index] != null) {
                newarr[index] = arr[index];
                return;
            }
        
            Integer a = null, b = null;
        
            int i = index;
            while (i < arr.length - 1 && (a = arr[++i]) == null);
        
            i = index;
            while (i > 1 && (b = arr[--i]) == null);
        
            newarr[index] = (a == null) ? b : (b == null) ? a : (a + b) / 2;
        }
        
        Integer[] arr = { null, null, 5, 111, 21, null, 22, null, null, null,
                98, 25, 47, null, 1, 23, null };
        
        Integer[] newarr = new Integer[arr.length];
        
        for (int i = 0; i < arr.length; i++)
            fill(newarr, arr, i);
        
        System.out.println(Arrays.toString(newarr));
        
        [5, 5, 5, 111, 21, 21, 22, 60, 60, 60, 98, 25, 47, 24, 1, 23, 23]