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
,因为它是数组的最后一个元素
有人知道如何为这个问题编写算法吗
假设这是在
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]