List>>> ,如何得到map的List>中List 重复的值以及map的key, 数据格式也就是:List,<经度,纬度>>>>,一个map就代表一条线路,线路由很多个带有经纬度的点组成,要得到哪些线路在哪段路重叠了,急求
List<Map<String,List<List<Double>>>> x = ...
for (Map<String,List<List<Double>>> x1 : x)
{
for (List<List<Double>> x2 : x1.values())
{
for (List<Double> x3: x2)
{
for (Double d : x3)
{
...
}
}
}
}
为什么不抽象成对象类,这样看的都晕啊,抽象成对象 比如map 对象 有个id就是key,然后有和map ,以此类推,重复的检查在各个类里面,这样写就只能for循环操作
package com.xxp;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException {
List<Map<String, List<Double>>> list = new ArrayList<Map<String, List<Double>>>();
Map<String, List<Double>> map1 = new HashMap<String, List<Double>>();
List<Double> list1 = new ArrayList<Double>();
list1.add(1d);
list1.add(2d);
list1.add(3d);
list1.add(4d);
list1.add(5d);
list1.add(6d);
list1.add(7d);
list1.add(8d);
map1.put("1", list1);
List<Double> list11 = new ArrayList<Double>();
list11.add(8d);
map1.put("2", list11);
List<Double> list12 = new ArrayList<Double>();
list12.add(8d);
map1.put("3", list12);
list.add(map1);
Map<String, List<Double>> map2 = new HashMap<String, List<Double>>();
List<Double> list2 = new ArrayList<Double>();
list2.add(1d);
list2.add(2d);
list2.add(3d);
list2.add(4d);
map2.put("1", list2);
List<Double> list21 = new ArrayList<Double>();
list21.add(4d);
map2.put("2", list21);
List<Double> list22 = new ArrayList<Double>();
list22.add(4d);
map2.put("3", list22);
list.add(map2);
Map<String, List<Double>> map3 = new HashMap<String, List<Double>>();
List<Double> list3 = new ArrayList<Double>();
list3.add(1d);
list3.add(2d);
list3.add(3d);
list3.add(4d);
list3.add(5d);
list3.add(6d);
map3.put("3", list3);
list.add(map3);
List<Map<String, List<Double>>> same_list = new ArrayList<Map<String, List<Double>>>();
for(int i = 0; i < list.size(); i++){ //便利所有路线集合
Map<String, List<Double>> same_map = new HashMap<String, List<Double>>();
Map<String, List<Double>> map = list.get(i);
Set<String> keys = map.keySet();
Iterator<String> keys_it = keys.iterator();
while(keys_it.hasNext()){ //便利当前路线所走的经纬度
String key = keys_it.next();
List<Double> value = map.get(key);
for(int j = i + 1; j < list.size(); j++){//用当前路线与其他路线做对比,直对比集合中,当前路线之后的
Map<String, List<Double>> map_after = list.get(j);
if(map_after.containsKey(key)){ //如果之后的路线中有和现在路线经度相同的,则进行便利,查看是否存在维度相同数据
List<Double> _same_list = compareList(value, map_after.get(key));
if(_same_list != null && !_same_list.isEmpty() && _same_list.size() > 0){
System.out.println( "--------------" + key + " " + Arrays.toString(_same_list.toArray()));
same_map.put(key, _same_list);
}
}
}
}
same_list.add(same_map);
}
System.out.println(same_list.size());
}
public static List<Double> compareList(List<Double> list, List<Double> list_after){
List<Double> same_list = new ArrayList<Double>();
for(Double d : list){
for(Double _d : list_after){
System.out.println(d + " " + _d);;
if(d.doubleValue() == _d.doubleValue()){
same_list.add(d);
}
}
}
return same_list;
}
}
不知道是不是你想要的,仅供参考哈,嘿嘿,更希望能分享一些比较好的解决算法。
可以把数据转为java.awt.geom.Line2D
Line2D 表示 (x, y) 坐标空间内的线段。像 Java 2D API 的所有类一样,此类使用称为用户空间 的默认坐标系统,其中 Y 轴的值向下增大,X 轴的值向右增大。有关用户空间坐标系统的更多信息,请参阅《Java 2D Programmer's Guide》中的 Coordinate Systems 部分。
此类是所有存储 2D 线段对象的惟一抽象超类。坐标的实际存储表示形式要靠子类来完成。
里面有提高相应的方法:
比如
public boolean intersectsLine(Line2D l)测试指定的线段是否与此线段相交。