Как отфильтровать List
Помогите пожалуйста отфильтровать data по содержанию, например по sendlocate
List<Map<String, String>> data = new ArrayList<Map<String, String>>();
private void loadIntoListView(String json) throws JSONException {
JSONArray jsonArray = new JSONArray(json);
String[] stocks = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
// stocks[i] = " From: " +obj.getString("mylocate") + " To: " + obj.getString("sendlocate") + " Name: " + obj.getString("starttime") ;
String entermylocate=obj.getString("mylocate");
String entersendlocate=obj.getString("sendlocate");
//if(ssendlocate.contentEquals(entersendlocate) ){
Map<String, String> datum = new HashMap<String, String>(2);
datum.put("mylocate", "From: " + entermylocate);
datum.put("sendlocate","To: " + entersendlocate);
datum.put("three fields", "From: " + obj.getString("starttime") + " " +
"Until: " + obj.getString("endtime")+ " $=:" + obj.getString("money") );
// datum.put("Forth Line",obj.getString("endtime"));
datum.put("id",obj.getString("id"));
datum.put("name",obj.getString("name"));
datum.put("email",obj.getString("email"));
data.add(datum);
//}
}
Ответы (1 шт):
Автор решения: m. vokhm
→ Ссылка
Не очень понял, что значит "в самой data"? Определить новый класс -- наследник ArrayList? Ну не знаю, это дело вкуса и зависит от обстоятельств, но я бы 10 раз подумал сначала. Но если очень хочется, то можно вот так, например:
class FilteringList extends ArrayList<Map<String, String>> {
public FilteringList(List<Map<String, String>> source) {
super(source);
}
public FilteringList filterOut(String key, String value) {
if (key == null || value == null)
throw new IllegalArgumentException("Can't bear with null arguments");
return new FilteringList(data.stream().filter(map -> value.equals(map.get(key)))
.collect(Collectors.toList()));
}
}
Но я бы лучше (скорее всего, опять же, зависит от обстоятельств) сделал отдельный метод в том классе, которому такая фукциональность нужна. Можно с потоками, но если с потоками не очень понятно, то можно и без потоков. Выбирайте на вкус:
private List<Map<String, String>> filterOutWithStreams(List<Map<String, String>> data, String key, String value) {
if (data == null || key == null || value == null)
throw new IllegalArgumentException("Can't bear with null arguments");
return new ArrayList<>(data.stream().filter(map -> value.equals(map.get(key)))
.collect(Collectors.toList()));
}
private List<Map<String, String>> filterOutWithoutStreams(List<Map<String, String>> data, String key, String value) {
if (data == null || key == null || value == null)
throw new IllegalArgumentException("Can't bear with null arguments");
final List<Map<String, String>> filtered = new ArrayList<>();
for (final Map<String, String> map: data)
if (value.equals(map.get(key)))
filtered.add(map);
return filtered;
}