我试图将纬度和经度坐标存储在ArrayList
中以计算第一次请求之后两个点之间的harversine公式,但我只是在其中只获得一个paar并获得输出{ {1}}。也许代码包含一些Jersey符号,但问题只涉及java部分。
latLondList size: 1
方法:
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
}
答案 0 :(得分:1)
您正在为列表的每次迭代创建一个新的ArrayList对象。
我认为您对其他语言中的static
关键字和java中的final
感到困惑。 final
并不意味着只有一个这个对象的实例,它只是意味着变量的值只初始化一次而且在变量的生命周期内无法更改(在你的例子中,它只是说你无法在方法中再次更改引用latLongList
。
具体来说,每次调用该方法时,都会创建一个新列表,并将一个元素推送到该列表。你不能将数组保留在两个调用之间。
要克服它,请将ArrayList
声明为instance variable,并仅在构建对象时创建一次。
编辑(回复编辑问题)
事实上,当你在方法中声明:
final ArrayList<LatLong> latLongList = new ArrayList<LatLong >();
你现在说,&#34;忘记我声明的latLongList
实例,而不是使用这个。
这不是您想要做的,解决方案很简单 - 删除此行,并在对象的构造函数中进行初始化latLongList = new ArrayList<LatLong >()
。
一种方法是更换一行:
private ArrayList<LatLong> latLongList;
与
private ArrayList<LatLong> latLongList = new ArrayList<>(); //java7+
当然,从方法中删除行:
final ArrayList<LatLong> latLongList = new ArrayList<LatLong >();
答案 1 :(得分:0)
private ArrayList<LatLong> latLongList = new ArrayList<LatLong>();
并注释掉
//latLongList = new ArrayList<LatLong>();