不用Map高效更新数据对应关系

      在处理数据的时候碰到一种情况:

      1.两条数据之间必须保持对应关系

      2. 尽量不使用map类型

   比如:ArrayList<Double>  douList   和  ArrayList<String>  strList之间必须保持对应关系,douList和strList来自同一条记录两个部分。但是我们不断的往douList中添加数据的时候要同时只保留最靠前的10条记录(假设是最大的10条记录),如果使用java 的HashMap类型的话,我们每次添加新的数据时都得先判断该数据是否比douList中的10条记录最小的要大,这样一来我们每次遇到新的数据都需要遍历一次HashMap。这样会把整个程序的时间复杂度翻10倍。当然我们可以使用TreeMap自动排序(只对key排序),但是要得到最后一条记录还是得先遍历完。

   我想到一种思路,同时使用两个ArrayList,如上面的douList和strList分别存储key 和value。

   这样我们每次遇到新数据时,只需和douList中最后一个元素比较即可。然后插入元素时获取插入元素位置,顺便更新strList中该位置的String即可。

具体程序实现如下:

	/**
	 * 在判定元素a 比list中最后一条记录高的时候才使用的插入元素方法
	 * @param list   保留了最高匹配度的前 best_comp_num的匹配值
	 * @param a      需要插入的匹配值
	 * @return      返回元素最后被插入的位置
	 */
	public int addElementGetPos(ArrayList<Double> list,double a){
		int pos=0;
		for(int i=best_comp_num-1;i>=0;i++)
		{
			if(a>list.get(i))
				{
				  list.set(i+1,list.get(i));     //由于插入元素之前list是已经按照升序排序好了的,所以插入元素只需要元素后移
				  pos=i;
				}
			else
				{
				  list.set(i,a);
				  break;
				}
		}
		pos=list.indexOf(a);
		
		return pos;
	}

我们刚开始时douList和strList同步插入元素时可以保持对应关系,但是douList需要排序,排序之后douList必须同时对应上。接下来是构建排序之后的对应关系代码:

/**
	 * 重构两个链表排序之后的对应关系,
	 * @param simil_list   传入的double类型 链表,此表会经过排序
	 * @param simil_copy   与simil_list表一一对应的String类型 链表
	 */
	public void rebuildRealation(ArrayList<Double> simil_list,ArrayList<String> simil_copy){
		ArrayList<Double> simil_sou=new ArrayList<Double>();
		simil_sou.addAll(simil_list);
		
		Collections.sort(simil_list);
		Collections.reverse(simil_list);
		
		ArrayList<String> arr_copy=new ArrayList<String>();
		arr_copy.addAll(simil_copy);
		
		for(int m=0;m<simil_list.size();m++)
		{
			int index=simil_sou.indexOf(simil_list.get(m));
			
			simil_copy.set(m,arr_copy.get(index));
		}

	}

测试:

  

	public static void main(String[] args){
		Test comp=new test();
		
		ArrayList<Double> dl=new ArrayList<Double>();
		dl.add(new Double(3));
		dl.add(new Double(1));
		dl.add(new Double(2));
		ArrayList<String> ds=new ArrayList<String>();
		ds.add("a");
		ds.add("b");
		ds.add("c");
		comp.rebuildRealation(dl, ds);
		System.out.println("重构关系之后");
		for(int i=0;i<dl.size();i++)
		{
			System.out.println(dl.get(i)+"\t"+ds.get(i));
		}
		
		
		
	}

结果

重构关系之后
3.0	a
2.0	c
1.0	b




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值