2017-03-01 67 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)' –