2017-03-01 68 views
0

新手到Java和Android ...如何迭代通过从对象派生的ArrayList

我正在使用类来存储一组Google地图LatLng点来遍历。下面是我使用分配一个ArrayList对象类:

public class GeoPoints implements Iterable<String>, Iterator<String> { 

private HashMap<String, Object> internalStorage = new HashMap<String, Object>(); 


private int count = 0; 

public void add(String key, Object value) { 
    internalStorage.put(key, value); 
} 

public Object get(String key) { 
    return internalStorage.get(key); 
} 

@Override 
public boolean hasNext() { 
    if (count < internalStorage.size()) { 
     return true; 
    } 
    return false; 
} 

@Override 
public String next() { 
    if (count == internalStorage.size()) throw new IndexOutOfBoundsException(); 

    count++; 

    return (String) internalStorage.keySet().toArray()[count - 1]; 
} 

@Override 
public void remove() { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public Iterator<String> iterator() { 
    return this; 
} 

}

我放置点是这样的:

geoPoints = new GeoPoints(); 



    // Load GeoPoints ArrayList... 
    List<LatLng> points = new ArrayList<LatLng>(); 

    points.add(new LatLng(45.778754, -124.811288)); 
    points.add(new LatLng(28.781740, -124.350814)); 
    points.add(new LatLng(48.712660, -60.982386)); 
    points.add(new LatLng(20.354554, -58.794457)); 


    geoPoints.add("US_MAP", points); 

要访问我使用一个对象for循环如下:

for (String key : geoPoints) { 

    Object obj = geoPoints.get(key); 

} 

在这一点上,我可以调试并看到Object obj包含ArrayL我是用上面的四点创建的。

对于我的生活,我无法弄清楚如何访问这些Arraylist值以迭代或循环的值。

我已经试过这样分配obj转换为一个ArrayList迭代器:

ArrayList<?> myTestItr = geoPoints.get(key); 

不工作,我相信原因是显而易见的... :)

我肯定是有这个简单的答案(使用Iterator通配符等),但我很短。

任何和所有的帮助,非常感谢!

提前致谢!

回答

1

,你是否尝试宣告你的地图如下:

private HashMap<String, List<LatLng>> internalStorage = new HashMap<String, List<LatLng>>(); 

这将意味着你只能添加类型List<LatLng>,但你可以很容易地遍历条目。

你必须编辑您的两种方法,以及:

public void add(String key, List<LatLng>value) { 
    internalStorage.put(key, value); 
} 

public List<LatLng>get(String key) { 
    return internalStorage.get(key); 
} 
+0

我会考虑使用这个。谢谢! – quiglyd

+0

如果你有一个特定的原因,为什么你在地图上使用了'Object',你可以像其他答案中提到的那样进行施放。 –

0

试图以编程方式将它转换:

ArrayList<?> myTestItr = (ArrayList<?>) geoPoints.get(key); 
+0

宾果!谢谢! – quiglyd

+0

标记答案为正确的PLZ,因此它不会显示为未解决。不客气。 – Ivan

0

你必须将Object类ArrayList中。

铸造就像将对象转换为受支持的类类型。

如果它不支持,它会抛出一个java.lang.ClassCastException

ArrayList<?> myTestItr = (ArrayList<?>) geoPoints.get(key); 

这应该解决您的问题。

0

与感谢所有,这里是解决方案和实施:

public class GeoPoints implements Iterable<String>, Iterator<String> { 


private HashMap<String, List<LatLng>> internalStorage = new HashMap<String, List<LatLng>>(); 


private int count = 0; 

public void add(String key, List<LatLng>value) { 
    internalStorage.put(key, value); 
} 

public List<LatLng> get(String key) { 
    return internalStorage.get(key); 
} 

@Override 
public boolean hasNext() { 
    if (count < internalStorage.size()) { 
     return true; 
    } 
    return false; 
} 

@Override 
public String next() { 
    if (count == internalStorage.size()) throw new IndexOutOfBoundsException(); 

    count++; 

    return (String) internalStorage.keySet().toArray()[count - 1]; 
} 

@Override 
public void remove() { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public Iterator<String> iterator() { 
    return this; 
} 

}

添加到对象:

geoPoints = new GeoPoints(); 

// Load GeoPoints ArrayList... 
List<LatLng> points = new ArrayList<LatLng>(); 

points.add(new LatLng(45.778754, -124.811288)); 
points.add(new LatLng(28.781740, -124.350814)); 
points.add(new LatLng(48.712660, -60.982386)); 
points.add(new LatLng(20.354554, -58.794457)); 


geoPoints.add("US_MAP", points); 

先用列表经纬度类型的新类

要遍历集合:

for (String key : geoPoints) { 

     List<LatLng> geoPointsXY = geoPoints.get(key); 

     Iterator geoPtsItr = geoPointsXY.iterator(); 


     while (geoPtsItr.hasNext()){ 

      LatLng oNxtLatLng = (LatLng) geoPtsItr.next(); 

      double yt = oNxtLatLng.latitude; 
      double nt = oNxtLatLng.longitude; 

      // Verify Coords here:... 




     } 

} 
+0

仅仅因为我现在看到它,您可以按照您可以遍历映射条目的方式迭代列表条目。如果你不必使用'Iterator',你可以使用'for(LatLng currentLatLng:points)' –