如何更新存储在 ArrayList 中的项目? (Android)
How to update an item stored in an ArrayList? (Android)
我正在从 Firebase
获取数据,在获取假定数据后,我将其存储在 ArrayList
上。所以这是示例代码。
markerArray = new ArrayList<>();
Firebase ref = new Firebase(Config.FIREBASE_URL_DRIVER);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() == 0) {
markerInfo();
} else {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
name = snapshot.child("driversName").getValue().toString().trim();
busNum = snapshot.child("busNum").getValue().toString().trim();
latitude = Double.valueOf(snapshot.child("latitude").getValue().toString().trim());
longitude = Double.valueOf(snapshot.child("longitude").getValue().toString().trim());
availableSeat = snapshot.child("availableSeat").getValue().toString().trim();
estimatedTime = snapshot.child("estimatedTime").getValue().toString().trim();
if ((!latitude.equals(null) || latitude.equals(0)) && (!longitude.equals(null) || longitude.equals(0)) && availableSeat.equals("") && (!estimatedTime.equals("") || estimatedTime.equals("0"))) {
convertLatLong();
getTotalPass();
Toast.makeText(MainMapActivity.this, currentLocation+" :currentLocation", Toast.LENGTH_SHORT).show();
markerArray.add(new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime));
}
}
Toast.makeText(MainMapActivity.this, "markerArraySize: "+markerArray.size(), Toast.LENGTH_SHORT).show();
for (i = 0; i < markerArray.size(); i++) {
createMarker(markerArray.get(i).getDriversName(), markerArray.get(i).getTotalPassenger(), markerArray.get(i).getBusNum(), markerArray.get(i).getLatitude(), markerArray.get(i).getLongitude(), markerArray .get(i).getLocation(), markerArray.get(i).getEstimatedTime());
}
}
}
}
我想更新我的 ArrayList
以便每当获取 Firebase 上的更改(尤其是纬度和经度)时,标记将不会 redundant/multiply。
我建议使用 map
(例如 HashMap
)来保存带有 ID 的数据。
然后稍后当发生变化时,您可以搜索id,它是否已经存储在地图中,并更改相应键的值。
如果您在其他地方将地图用作列表,您还可以从地图中获取所有值作为列表。
地图方面的一些帮助:
Driver 应该是你的类型,String 可以是键的类型,比如 busNum 或名称。
创建地图:
Map<String, Driver> markersMap = new HashMap<String, Driver>();
输入值并检查它们的键:
Driver driver = new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime);
// that's how you check if there's already a value
markersMap.containsKey(name);
// A put overwrites the value anyway, so maybe you don't need the check
markersMap.put(name, driver)
此外,为了将值作为列表获取,应该有一个 values()
映射方法,或类似的方法。
使用arraylist的set(position,data)方法来消费你的需求
ArrayList<String> alstr = new ArrayList<>();
alstr.add("khan");
alstr.add("yogesh");
alstr.add("kapil");
alstr.add("rajoria");
for(String str : alstr) {
System.out.println(str);
}
// update value here
alstr.set(3, "Ramveer");
System.out.println("with Iterator");
Iterator<String> itr = alstr.iterator();
while (itr.hasNext()) {
Object obj = itr.next();
System.out.println(obj);
}
您可以使用带有位置和数据参数的 ArrayList class 的 set() 方法来设置 ArrayList 中的值。
set(int index, Element E)
但这只有在您知道项目的位置需要更改时才会对您有所帮助。
那么我从您的代码中了解到,您想要唯一标识应用程序中每个 driver 位置的变化。
所以是的,保留 HashMap
是个好主意,因为您不必担心用于识别特定 driver 位置变化的唯一密钥.
但是,因此,我建议将从您的 Firebase 获取的数据保存在本地 sqlite 数据库文件中,并且每次更新时,您都可以 re-analyze 您的数据来创建再次标记(即刷新标记)。
例如,您可以有三个 table。
- 一个用于列出所有 drivers(主键
driver_id
)
- 您的旅行。 (主键
trip_id
和 Trip table 中的每一行都与一个 driver_id
相关联)
- 一个用于列出所有游乐设施(此 table 将包含有关每个游乐设施的所有信息以及纬度和经度。您的 firebase 数据库中的每个更新都将在此处有一个条目)
table 可能看起来像
司机table
driver_id - 1
name - Driver 1
driver_id - 2
name - Driver 2
行程 table
trip_id - 1
driver_id - 1
trip_id - 2
driver_id - 1
trip_id - 3
driver_id - 2
游乐设施table
trip_id - 1
driver_id - 1
longitude - 9.4
latitude - 38
updateTime - 78783232
trip_id - 1
driver_id - 1
longitude - 5.8
latitude - 53
updateTime - 78783242
trip_id - 1
driver_id - 1
longitude - 78
latitude - 56
updateTime - 78783252
trip_id - 2
driver_id - 1
longitude - 8
latitude - 77
updateTime - 78783262
现在,每次 Firebase 更新本地数据库并为地图中的每个 driver 重新绘制标记时,table 您就可以从 Rides re-analyze 获取数据。
您可以使用简单的 sql 查询来创建 driver 基于 updateTime
走过的路径。根据updateTime
对路径点进行排序,并删除任何具有相同经度和纬度的连续数据。
希望对您有所帮助。
我正在从 Firebase
获取数据,在获取假定数据后,我将其存储在 ArrayList
上。所以这是示例代码。
markerArray = new ArrayList<>();
Firebase ref = new Firebase(Config.FIREBASE_URL_DRIVER);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() == 0) {
markerInfo();
} else {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
name = snapshot.child("driversName").getValue().toString().trim();
busNum = snapshot.child("busNum").getValue().toString().trim();
latitude = Double.valueOf(snapshot.child("latitude").getValue().toString().trim());
longitude = Double.valueOf(snapshot.child("longitude").getValue().toString().trim());
availableSeat = snapshot.child("availableSeat").getValue().toString().trim();
estimatedTime = snapshot.child("estimatedTime").getValue().toString().trim();
if ((!latitude.equals(null) || latitude.equals(0)) && (!longitude.equals(null) || longitude.equals(0)) && availableSeat.equals("") && (!estimatedTime.equals("") || estimatedTime.equals("0"))) {
convertLatLong();
getTotalPass();
Toast.makeText(MainMapActivity.this, currentLocation+" :currentLocation", Toast.LENGTH_SHORT).show();
markerArray.add(new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime));
}
}
Toast.makeText(MainMapActivity.this, "markerArraySize: "+markerArray.size(), Toast.LENGTH_SHORT).show();
for (i = 0; i < markerArray.size(); i++) {
createMarker(markerArray.get(i).getDriversName(), markerArray.get(i).getTotalPassenger(), markerArray.get(i).getBusNum(), markerArray.get(i).getLatitude(), markerArray.get(i).getLongitude(), markerArray .get(i).getLocation(), markerArray.get(i).getEstimatedTime());
}
}
}
}
我想更新我的 ArrayList
以便每当获取 Firebase 上的更改(尤其是纬度和经度)时,标记将不会 redundant/multiply。
我建议使用 map
(例如 HashMap
)来保存带有 ID 的数据。
然后稍后当发生变化时,您可以搜索id,它是否已经存储在地图中,并更改相应键的值。
如果您在其他地方将地图用作列表,您还可以从地图中获取所有值作为列表。
地图方面的一些帮助: Driver 应该是你的类型,String 可以是键的类型,比如 busNum 或名称。 创建地图:
Map<String, Driver> markersMap = new HashMap<String, Driver>();
输入值并检查它们的键:
Driver driver = new Driver(name, totalPassenger, busNum, latitude, longitude, currentLocation, estimatedTime);
// that's how you check if there's already a value
markersMap.containsKey(name);
// A put overwrites the value anyway, so maybe you don't need the check
markersMap.put(name, driver)
此外,为了将值作为列表获取,应该有一个 values()
映射方法,或类似的方法。
使用arraylist的set(position,data)方法来消费你的需求
ArrayList<String> alstr = new ArrayList<>();
alstr.add("khan");
alstr.add("yogesh");
alstr.add("kapil");
alstr.add("rajoria");
for(String str : alstr) {
System.out.println(str);
}
// update value here
alstr.set(3, "Ramveer");
System.out.println("with Iterator");
Iterator<String> itr = alstr.iterator();
while (itr.hasNext()) {
Object obj = itr.next();
System.out.println(obj);
}
您可以使用带有位置和数据参数的 ArrayList class 的 set() 方法来设置 ArrayList 中的值。
set(int index, Element E)
但这只有在您知道项目的位置需要更改时才会对您有所帮助。
那么我从您的代码中了解到,您想要唯一标识应用程序中每个 driver 位置的变化。
所以是的,保留 HashMap
是个好主意,因为您不必担心用于识别特定 driver 位置变化的唯一密钥.
但是,因此,我建议将从您的 Firebase 获取的数据保存在本地 sqlite 数据库文件中,并且每次更新时,您都可以 re-analyze 您的数据来创建再次标记(即刷新标记)。
例如,您可以有三个 table。
- 一个用于列出所有 drivers(主键
driver_id
) - 您的旅行。 (主键
trip_id
和 Trip table 中的每一行都与一个driver_id
相关联) - 一个用于列出所有游乐设施(此 table 将包含有关每个游乐设施的所有信息以及纬度和经度。您的 firebase 数据库中的每个更新都将在此处有一个条目)
table 可能看起来像
司机table
driver_id - 1
name - Driver 1
driver_id - 2
name - Driver 2
行程 table
trip_id - 1
driver_id - 1
trip_id - 2
driver_id - 1
trip_id - 3
driver_id - 2
游乐设施table
trip_id - 1
driver_id - 1
longitude - 9.4
latitude - 38
updateTime - 78783232
trip_id - 1
driver_id - 1
longitude - 5.8
latitude - 53
updateTime - 78783242
trip_id - 1
driver_id - 1
longitude - 78
latitude - 56
updateTime - 78783252
trip_id - 2
driver_id - 1
longitude - 8
latitude - 77
updateTime - 78783262
现在,每次 Firebase 更新本地数据库并为地图中的每个 driver 重新绘制标记时,table 您就可以从 Rides re-analyze 获取数据。
您可以使用简单的 sql 查询来创建 driver 基于 updateTime
走过的路径。根据updateTime
对路径点进行排序,并删除任何具有相同经度和纬度的连续数据。
希望对您有所帮助。