2016-12-06 41 views
1

我有2個列表,我發送到MySql。反向列表,但一次

public ArrayList<Double> lat = new ArrayList<Double>(); 
public int l = lat.size(); 

public ArrayList<Double> lng = new ArrayList<Double>(); 
public int ll = lng.size(); 

Double l = lat.get(i); 
Double ll = lng.get(i); 

String sql = "INSERT INTO tab (lat, lng) VALUES('" + l + "', '" + ll + "')"; 
       stmt.executeUpdate(sql); 

,但在錯誤的順序,所以我把

Collections.reverse(lat); 
Collections.reverse(lng); 

Double l = lat.get(i); 
Double ll = lng.get(i); 

,一切都井井有條,的作品當我再次使用此方法與此列表中的相同元素順序將再次顛倒......

將元素添加到列表中:

lat.add(l, currentLatitude); 
lng.add(ll, currentLongitude); 

怎麼辦,那些元素一直處於良好狀態?

+0

完全粘貼您的代碼。 – Shriram

+0

你可以維護標誌變量列表是否被反轉?它會在你的情況下工作 –

+1

使用ListIterator及其hasPrevious API。它將幫助你以相反的順序解析列表。 – Vinodh

回答

1

使用ListIterator及其hasPrevious API。它將幫助你以相反的順序解析列表。

public ArrayList<Double> lat = new ArrayList<Double>(); 
    public int l = lat.size(); 

    public ArrayList<Double> lng = new ArrayList<Double>(); 
    public int ll = lng.size(); 


    ListIterator latIt = lat.listIterator(l); 
    ListIterator longIt = lng.listIterator(ll); 

    while(latIt.hasPrevious()) { 
     System.out.println(latIt.previous()); 
    } 
    while(longIt.hasPrevious()) { 
     System.out.println(longIt.previous()); 
    } 
0

Collections.reverse方法更新latlng秩序,因爲這段代碼是通過一個按鈕執行,執行它所有的時間是不是對你合適。我想你可以只遍歷latlng的ArrayList從年底開始:

public ArrayList<Double> lat = new ArrayList<Double>(); 
for(int l=0 ...){ 
    ... retrieve currentLatitude 
    lat.add(l, currentLatitude); 
} 
public int l = lat.size(); 

public ArrayList<Double> lng = new ArrayList<Double>(); 
for(int ll=0 ...){ 
    ... retrieve currentLongitude 
    lng.add(ll, currentLongitude); 
} 
public int llsize = lng.size(); 

for(int i=llsize-1;i>=0;i--){ 

    Double l = lat.get(i); 
    Double ll = lng.get(i); 

    String sql = "INSERT INTO tab (lat, lng) VALUES('" + l + "', '" + ll + "')"; 
    stmt.executeUpdate(sql); 
} 
... 
+0

它不起作用,因爲「Collections.reverse」仍然在按鈕代碼中,並且按下任何原因導致另一次反轉,並且當我將'Collections.reverse'放在代碼按鈕之外時,它將永遠不會執行 – lukash

+0

好吧,我不知道關於這個,「Collections.reverse」不適合這種情況。嘗試從最後開始迭代數組列表。我更新了答案中的代碼。 – user6904265

+0

它看起來像它會工作,但我不知道如何編碼此循環與int l/ll = 0 – lukash

0

把你列出一個緩衝區,每個列表。

var bufLat = new ArrayList<Double>(lat); 
var bugLng = new ArrayList<Double>(lng); 

那麼每一個操作,使其在緩衝區:

Collections.reverse(bufLat); 
Collections.reverse(bufLng); 

Double l = bufLat.get(i); 
Double ll = bufLng.get(i); 

這樣可以避免修改列表的原始順序,你可以繼續添加新的項目維護他們的秩序插入列表中。

至於關注你的方式做數據庫SQL INSERT到DB:

String sql = "INSERT INTO tab (lat, lng) VALUES('" + l + "', '" + ll + "')"; 
stmt.executeUpdate(sql); 

這是一個不太好的做法,因爲它打開可能的SQL注入攻擊。對於一個更好的解決方案看這個例如在SO https://stackoverflow.com/a/8218932/3762855

+0

我只會在這裏警告有關SQL注入,因爲我真的不相信你將能夠注入任何東西雙重實例。 – AxelH

+0

它是可能的,只是它需要你更好地看看sql語句中的「l」和「ll」值的單引號...... –

+0

您可以添加一個如何使用此注入查詢的示例?是的,查詢將具有字符類型,但在Java中,您只有數字值,所以我沒有看到你的可能,但我可能會錯過一些東西。 – AxelH

0
lat.add(l, currentLatitude); 
lng.add(ll, currentLongitude); 

看起來有點怪異根據的Javadoc(https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#add-int-E-) L和LL應該是指數,因爲,在這裏,您使用的雙重價值。

您可能已在此切換參數

+0

你說什麼意思是「l和ll應該是索引」 – lukash

+0

好吧,這裏是ArrayList類的add方法的簽名: –

+0

'code' public void add (int index,E element) 'code' 我不明白的是在ArrayList中使用雙精度作爲索引: 'code' Double l = lat.get(i); Double ll = lng.get(i); 'code' –