У меня проблема с сравнением двух arraylist,
мой первый arraylist выглядит следующим образом:
{TeamID=4, Group=A, TeamName=Germany}
{TeamID=6, Group=A, TeamName=Turkey}
мой второй список:
{TeamID=4, Chance=99.9%}
{TeamID=6, Chance=38.4%}
а затем я хочу создать один список, который будет выглядеть следующим образом:
{TeamID=4, Group=A, TeamName=Germany Chance=99.9%}
{TeamID=6, Group=A, TeamName=Turkey Chance=38.4%}
Можете ли вы мне помочь?
Первый список:
private ArrayList<HashMap<String, String>> TeamList = this.xml.TeamListList;
Во-вторых:
private ArrayList<HashMap<String, String>> QChanceList = this.xml.QChanceListList;
Вот одна идея. Для каждой команды я ищу соответствующую запись в списке шансов, затем я помещаю все записи с обеих карт в новую.
public static List<Map<String, String>> merge(
List<Map<String, String>> teams, List<Map<String, String>> chances) {
// create the result
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
// now we assume that for each team there is one chance (valid?)
for (Map<String, String> team:teams) {
boolean success = false;
Map<String, String> combined = new HashMap<String, String>();
combined.putAll(team);
String id = team.get("TeamID");
// now we have to find the "chance" map
for (Map<String, String> chance:chances) {
if (chance.get("TeamID").equals(id)) {
combined.putAll(chance);
boolean success = true;
break;
}
}
if (!success) {
// there was no entry in chances map with this id!! -> handle problem
}
result.add(combined);
}
return result;
}
(Этот пример не очень безопасен fail-, он утверждает, что все карты имеют значения для "TeamId", я просто демонстрирую, что что-то нужно делать в случае незаконного ввода, например, неполного списка шансов)
Список команд должен представлять собой карту карт. Использовать идентификатор команды в качестве ключа во внешней карте (если вы не хотите менять базу данных).
Слияние записей было бы очень просто. Перейдите по списку случайных ситуаций, получите команду из карты команд и используйте teamMap.putAll(mapFromChanceList)
Изменить: обновить пример.
Map<String, Map<String, String> teams = new HashMap<String, Map<String, String>();
Map<String, String> team = new Map<String, String>();
//populate the team map, and with TeamID, TeamName etc, then do something like this.
teams.put(team.get("TeamID"), team);
//You get a team by doing:
Map<String, String> team = teams.get(teamId); //where teamId is e.g. "4"
Аналогично Andreas_D, вот еще один способ обмануть этого кота.
Я хотел бы сказать, что я до сих пор согласен с Дори, это действительно похоже на данные базы данных. Я бы рекомендовал вам использовать базу данных и избавиться от головной боли для решения этой проблемы, которая уже решена.
Либо это, либо работать с владельцем API, который вы используете для получения этих данных, и заставить их использовать правильный запрос базы данных, чтобы объединить его, прежде чем он когда-либо доберется до вас.
Из-за этого лучше всего сделать что-то подобное, чтобы добраться до этой точки, чтобы вы могли использовать утилиты hashmap.
....
HashMap<String, HashMap<String, String>> unifiedMap = new HashMap<String, HashMap<String, String>>();
for (HashMap<String, String> teamMap : teamList) {
String teamId = teamMap.get("TeamID");
HashMap<String, String> mapFromUnified = unifiedMap.get(teamId);
if (mapFromUnified == null) {
unifiedMap.put(teamId, teamMap);
} else {
for (String key : teamMap.keySet()) {
// this will be a race condition, the last one in wins - good luck!
mapFromUnified.put(key, teamMap.get(key));
}
}
}
for (HashMap<String, String> teamMap : chanceList) {
String teamId = teamMap.get("TeamID");
HashMap<String, String> mapFromUnified = unifiedMap.get(teamId);
if (mapFromUnified == null) {
unifiedMap.put(teamId, teamMap);
} else {
for (String key : teamMap.keySet()) {
// this will be a race condition, the last one in wins - good luck!
mapFromUnified.put(key, teamMap.get(key));
}
}
}
....