关于Java处理清洗Map中的数据

yytf 发布于 05/06 11:18
阅读 1K+
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

例子:

创建一个map, key表示时间戳    value 表示 值

遍历对map中值为零的数进行补数,补充的规则是,用这个零值前后相邻有值的数 求平均值赋值给这个为零的value,依次类推,把里面所有value为零的数都补充上值。哪位大牛可以聊聊,谢谢

加载中
1
tcxu
tcxu
  • 按楼主要求,健依次为间隔15分钟的时间戳。
  • 已知,TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。
  • 因此,必须使用 TreeMap 存储信息,元素数值 value 按时间戳升序储存。这样,两个相邻元素,就是指时间戳间隔最近(最小)的元素。
  • 这里,Map 的 第一个元素,为 "虚设 Dummy", 其值 velue 设为 0。
  • 以下代码专门为   Kendlowski 的数据 (浮点型), 楼主 yytf 出示的解而写。
  • 其它情况,比如,0 1 0 0 0 3 1 0 0 ,即最后一个元素的 值 velue 为零,有待讨论。
import java.text.*;
import java.util.*;
public class Yytf0{
   private static Map<Date, Float> map; //
   final static long  interval = 1000*60*15; //每隔15分钟记录一次数值 value
   static float data[]= {0, 1, 0, 0, 0, 3, 1, 0, 1}; //已知Treemap 的 values
 
   public static void main( String args[] ){
   	  	
   	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   	// 用 Kendlowski 的数据 (浮点型), key 为 时间戳, 创建一个 Map
   	Calendar now = Calendar.getInstance();  
   	Date da = now.getTime(); 
    map = new TreeMap<Date, Float>(); 
    for (int i=0;i<data.length;i++){ 
   		da = now.getTime();  	
    	da.setTime((da.getTime()+interval*i));
        map.put( da, new Float(data[i]));
  	}; 
  	
  	printMap(map, "健为时间戳的原始map:");
  
   	for (int i=1;i<data.length; i++)
   		if (data[i]==0)
   		data[i] = mean(i);

    for (int i=0;i<data.length;i++){ 
   		da = now.getTime();  	
    	da.setTime((da.getTime()+interval*i));
        map.put( da, new Float(data[i]));
  	}; 
    printMap(map, "实行补数操作后的map:"); 	  	  
   };
   
   static void printMap(Map<Date, Float> map, String title){
   	System.out.println(title);
   	Iterator<Date> it = map.keySet().iterator();  
    while(it.hasNext()){
    Date key = it.next();
    System.out.println(key + "=" + map.get(key));
   	} ;
   }
   
   static float mean(int k){ //求这个零值前后相邻有值的数的平均值
	int j = k;
	float before = data[k-1];
   	while (data[j] == 0)
   	j++;
   	return (data[j]+before)/2;
   }
} 

0
K
Kendlowski

values:

0 1 0 0 0 3 1 0 1

算出来结果应该是多少

tcxu
tcxu
回复 @yytf : 第一个元素的值 value 怎么处置?它没有被"补零"。应当有个说法。是否总是认为,map 的第一个元素的值是"dummy", 不可用?若第一个元素的值不为零,而第二个元素的值为零,那么当给第二个元素的value"去零"时,还必须用到第一个元素的值。所以,第一个元素的value有时还要用。
yytf
yytf
0 1 2 2.5 2.75 3 1 1 1 依次算0前后数的平均数值
0
邦成

[0.5] 1 [0.5] [0] [1.5] 3 1 [1] 1   百度怎么循环map,循环中怎么拿到值然后 求平均值, 将结果值丢进新map 

0
tcxu
tcxu
  • 是否要明确元素的 value (数值),都大于零?
  • 是否对map 补数后,要求全部元素的数值都不为零?
  • 楼主的补充规则(用这个零值前后相邻有值的数求平均值赋值给这个为零的value),是否意味着, 如果前后相邻的元素的value 也为零,那它就不算是相邻的元素?那么相邻的value不为零(即有值)的元素,应当说成是"离该值为零的元素距离最近的 value 不为零(有值)的元素"。
  • 元素 的 value 值,以及 取平均的算法应做规定。数值可以为负数、小数吗?取平均可以是小数吗?

以下情况如何处理?

  • 第一个元素为零,其前面没有元素,如何处置?是否要预先单独处置?是否可以将其后面元素的数值的一半,赋予第一个元素的value?
  • 若第一个元素为零,其后的元素也是零,零的半数还是零,将这个"半数零"赋予第一个元素,那第一个元素的数值仍是零。这个"补数操作"无效。
  • 对于一个给定的、数值为零的元素,若其前后的数值一样,但符号相反,则平均值为零,补数后改变不了这个元素数值为零的状态。
0
tcxu
tcxu

引用来自“Kendlowski”的评论

values:

0 1 0 0 0 3 1 0 1

算出来结果应该是多少

若事先为第一个元素的补数操作规定了方法:只取后面元素的value的一半赋值,则经过整个 map 补数操作后, map 的 values 排列结果为:
0.5 1 0.5 0.25 1.575 3 1 1 1 
 

tcxu
tcxu
回复 @yytf : 代码已经写好,发出。请批评。
yytf
yytf
回复 @tcxu :map中 key是时间戳,每个时间戳相隔15分钟
tcxu
tcxu
回复 @yytf : 谢谢你的要求。我有了新的疑问:何谓map中的相邻元素? 楼主所说的 map 中 "相邻元素",指的是什么?是由时间戳先后顺序(大小)而定?还是由其它什么标准而定?
yytf
yytf
回复 @tcxu : 老哥,能贴一下代码吗?谢谢
tcxu
tcxu
回复 @yytf : 针对你的这个给定的 map, 补数的规则规定如下: 1.对 value 为零的第一个元素补数,只取其后面元素的 value 数值,除以二,将所得值赋予第一个元素的 value。 2.然后,开始从第一个元素遍历,遇到 value 为零的元素,补充数值的规则是:用这个零值前后相邻的 value的数值,不管值是否为零,均求平均值,赋值给这个为零的value。
下一页
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部