Android, создайте один массив из двух - PullRequest
1 голос
/ 09 июня 2011

У меня проблема со сравнением двух массивов,

мой первый массив выглядит так:

{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;

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Вот одна идея. Для каждой команды я ищу соответствующую запись в списке шансов, затем помещаю все записи с обеих карт в новую.

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;
}

(Этот пример не очень надежен, он утверждает, что все карты имеют значения для "TeamId", я просто демонстрирую, что что-то должно быть сделано в случае недопустимого ввода, например, неполный список шансов)

1 голос
/ 09 июня 2011

В списке команд должна быть карта карт. Используйте идентификатор команды в качестве ключа на внешней карте (если вы не хотите переходить в базу данных).

Объединить записи будет очень легко. Переберите список шансов, найдите команду с карты команд и используйте 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"
0 голосов
/ 09 июня 2011

Подобно 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));
        }
    }
}
....  
...