【问题标题】:ArrayList does not store the second elementArrayList 不存储第二个元素
【发布时间】:2015-05-04 10:28:41
【问题描述】:

我试图将纬度和经度坐标存储在ArrayList 中,以在第一次请求后计算两个点之间的 harversine 公式,但我只得到一个 paar,我得到了输出 latLondList size: 1 .也许代码包含一些泽西符号,但问题只涉及 java 部分。

storeData方法:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response storeData(Data data) {

    String macD = data.getMac();
    int routeD = data.getRoute();
    float latD = data.getLatitude();
    float longD = data.getLongitude();

    final ArrayList<LatLong> latLongList = new ArrayList<LatLong >();
    latLongList.add(new LatLong(latD, longD));

    System.out.println("latLondList size: "latLongList.size());

    Database db = new Database();
    db.insertData(macD, routeD, latD, longD);

    return Response.status(201).build();
}

Data类:

@Provider
public class Data {
    private String mac;
    private int route;
    private float latitude;
    private float longitude;
    // constructor with getter and setter
}

LatLong类:

public class LatLong {

    float latitude;
    float longitude;

    // constructor with getter and setter
}

编辑:

private ArrayList<LatLong> latLongList = new ArrayList<>();

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response storeData(Data data) {

    String macD = data.getMac();
    int routeD = data.getRoute();
    float latD = data.getLatitude();
    float longD = data.getLongitude();

    latLongList.add(new LatLong(latD, longD));
}

【问题讨论】:

  • 您正在向列表中添加一个元素。您期望的第二个值是多少?
  • 您在哪里向latLongList 添加第二个元素?问题是什么?
  • 您正在为列表的每次迭代创建一个新的 ArrayList 对象。我认为您对其他语言中的 static 关键字和 java 中的 final 感到困惑。 final 并不意味着该对象只有一次实例。具体来说,每次调用该方法时,都会创建一个新列表,并将一个元素推送给它。您不会在两次调用之间保留数组。
  • 每次添加新对时都会创建一个新的空列表。
  • 你每次都在创建一个新的 ArrayList,所以之前的会丢失。

标签: java arraylist


【解决方案1】:

您正在为列表的每次迭代创建一个新的 ArrayList 对象。

我认为您对其他语言中的 static 关键字和 java 中的 final 感到困惑。 final 并不意味着这个对象只有一次实例,它只是意味着变量的值只被初始化一次并且在变量的生命周期内不能改变(在你的例子中,它只是说你不能改变引用 @987654325 @再次在方法中)。

具体来说,每次调用该方法时,都会创建一个新列表,并将一个元素推送给它。您不会在两次调用之间保留数组。

要克服它,请将您的 ArrayList 声明为 instance variable,并且只创建一次 - 在对象的构造中。


EDIT(对问题的编辑回复)

其实在方法中声明的时候:

final ArrayList<LatLong> latLongList = new ArrayList<LatLong >();

你现在说,“忘记我声明的 instace veriable latLongList,改用这个。

这不是你想做的,解决方法很简单——去掉这一行,在对象的构造函数中初始化latLongList = new ArrayList&lt;LatLong &gt;()

一种方法是替换该行:

private ArrayList<LatLong> latLongList;

private ArrayList<LatLong> latLongList = new ArrayList<>(); //java7+

当然,从方法中删除以下行:

final ArrayList<LatLong> latLongList = new ArrayList<LatLong >();

【讨论】:

  • 我将它声明为全局变量,但它仍然无法工作,请查看我现在得到的编辑代码1 作为输出?!
  • @benz 见编辑,原因是一样的,基本上 - 你使用的是方法变量而不是实例变量。
  • 如何在对象的构造函数中进行初始化?请在您的答案中写下代码以理解您的观点。
  • 我搜索了java initialization in the constructor of the object,但没有找到解决方案,因为我没有构造函数来初始化它!
  • @benz 您可以(1)添加构造函数,或(2)使用我在答案中建议的语法糖(相当于在构造函数中执行)。
【解决方案2】:
private ArrayList<LatLong> latLongList = new ArrayList<LatLong>();

并注释掉

//latLongList = new ArrayList<LatLong>();

【讨论】:

  • 你应该解释原因。这个网站教它的访问者,而不是解决一个特定的问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2017-08-07
相关资源
最近更新 更多