Android, создайте один массив из двух

1

У меня проблема с сравнением двух 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;
  • 0
    Что у вас в arraylists? строки? объекты?
  • 1
    выглядит как SQL-соединение с использованием teamID в качестве основного ключа - в зависимости от размера и характера ваших данных / приложения вы можете подумать об использовании SQLLite
Показать ещё 3 комментария
Теги:
arraylist
compare

3 ответа

1
Лучший ответ

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

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", я просто демонстрирую, что что-то нужно делать в случае незаконного ввода, например, неполного списка шансов)

1

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

Слияние записей было бы очень просто. Перейдите по списку случайных ситуаций, получите команду из карты команд и используйте 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
    спасибо за ответ, можете ли вы сказать мне, как я могу создать карту карт с ключом?
  • 0
    @Grins Смотрите мой обновленный ответ
Показать ещё 2 комментария
0

Аналогично 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));
        }
    }
}
....  

Ещё вопросы

Сообщество Overcoder
Наверх
Меню