在处理数据的时候碰到一种情况:
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