【问题标题】:Reverse lists but one time反向列表但一次
【发布时间】:2016-12-06 09:44:26
【问题描述】:

我有 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);

怎么办,元素一直都井井有条?

【问题讨论】:

  • 完全粘贴您的代码。
  • 您可以维护标志变量列表是否反转?它适用于你的情况吗
  • 使用 ListIterator 及其 hasPrevious API。它将帮助您以相反的顺序解析列表。

标签: java android arraylist


【解决方案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());
    }

【讨论】:

    【解决方案2】:

    将您的列表放入缓冲区中,每个列表一个。

    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);
    

    通过这种方式,您可以避免修改列表的原始顺序,并且可以继续添加新项目,保留它们在列表中的插入顺序。

    就您将 db sql 插入 db 的方式而言:

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

    这不是一个很好的做法,因为它可能会引发 sql 注入攻击。要获得更好的解决方案,请参阅 SO https://stackoverflow.com/a/8218932/3762855 上的这个示例

    【讨论】:

    • 我在这里只警告 SQL 注入,因为我真的不相信你能用 Double 实例注入任何东西。
    • 有可能……只是需要你更好地查看sql语句中“l”和“ll”值周围的单引号……
    • 您能否添加一个示例,说明如何使用 this 注入查询?是的,查询将具有字符类型,但在 Java 中,您只有数字值,所以我看不出你怎么能,但我可能会错过一些东西。
    • 哎呀我以为是 C#.. 但是最好避免以这种方式调用 sql 语句,而当它们在文本字段上有过滤器时,它应该始终特别参数化 sqlStatement
    • 我同意!但这有时是可选的(但要谨慎)
    【解决方案3】:
    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 应该是索引,在这里,您使用的是双精度值。

    你可能在这里切换了参数

    【讨论】:

    • 你说“l和ll应该是索引”是什么意思
    • 好吧,这里是 ArrayList 类的 add 方法的签名:
    • code public void add(int index, E element) code 我不明白 Doubles 作为 ArrayList 中的索引的用法:code Double l = lat.get (一世);双 ll = lng.get(i); code
    【解决方案4】:

    Collections.reverse 方法更新了latlng 的顺序,这对你来说是不行的,因为这段代码是由一个按钮执行的,它一直在执行。我认为您可以从末尾开始迭代 latlng 数组列表:

    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);
    }
    ...
    

    【讨论】:

    • 它不起作用,因为“Collections.reverse”仍在按钮代码中并且按下任何导致另一个反转,并且当我将“Collections.reverse”放在代码按钮之外时,它永远不会执行
    • 好的,我不知道,“Collections.reverse”不适合这种情况。尝试从末尾开始迭代数组列表。我更新了答案中的代码。
    • 看起来它可以工作,但我不知道如何用 int l/ll = 0 编写这个循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2011-11-12
    • 1970-01-01
    • 2013-05-05
    • 2019-05-01
    • 2017-11-16
    相关资源
    最近更新 更多