2016-12-06 39 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' –