Android – Как объединить два ArrayLists

У меня есть два массива ArrayLists, созданных из проанализированного html. Первый содержит задания и

Job A Job B Job C 

А второй –

 Company A Company B Company C 

Мне нужна комбинация Job A и Company A и т. Д., Поэтому я могу получить такие результаты, как (ArrayList тоже будет замечательно)

 Job A : Company A Job B : Company B Job C : Company C 

Я не нашел ясного учебника или чего-то еще. Есть идеи?

Вы уверены, что ищете правильную структуру данных для этого?

Почему бы не использовать карту ? Вы можете определить отношение ключ / значение, идущее по этому маршруту.

 Map<Company, Job> jobMap = new HashMap<Company, Job>(); jobMap.put("Company A" /* or corresponding list item */, "Job A" /* or corresponding list item */); 

Вы можете даже сделать что-то вроде этого: (Поменяйте строки, чтобы они соответствовали вашей реализации)

 Map<Company, List<Job>> jobMap...; List<Job> jobList = new ArrayList<Job>(); jobList.add("Job A"); jobList.add("Job B"); jobList.add("Job C"); jobMap.put("Company A", jobList); 

Что это будет делать, так это определить компанию как ваш ключ, и вы можете установить несколько рабочих мест для компании

 if (jobs.length() != companies.length()) { throw new InvalidArgumentException("Mismatch of jobs and companies"); } for (int i = 0; i < jobs.length(); i++) { combine(jobs.get(i), companies.get(i)); } 

Существует множество способов объединения ссылок между двумя типами объектов. Вот гибкий пример, который позволит вам использовать его для поиска другого. Это слишком много, если вы знаете, что вы всегда будете использовать для поиска. Использование LinkedHashMap также сохраняет порядок вставки. Поэтому, если вы решите поместить их в B, C, A, вы можете получить их в B, C, A порядке.

 LinkedHashMap<Job, Company> jobToCompany = new LinkedHashMap<>(); LinkedHashMap<Company, Job> companyToJob = new LinkedHashMap<>(); private void combine(Job job, Company company) { jobToCompany.put(job, company); companyToJob.put(company, job); } 

Если вы действительно хотите сохранить комбинированные значения в ArrayList тогда для вас будет работать следующий код:

 List<String> jobs = new ArrayList<>(); List<String> companies = new ArrayList<>(); List<String> mergedList = new ArrayList<>(); //assuming the value are populated for `jobs` and `companies`. if(jobs.size() == companies.size()) { int n = jobs.size(); for(int index=0; index<n; index++) { mergedList.add(jobs.get(index) + " : " + companies.get(index)) } } else { System.out.println("Cannot combine"); //Throw exception or take any action you need. } 

Имейте в виду, что если вам нужно искать какой-либо элемент, это будет O (n), но я предполагаю, что вы знаете об этом, прежде чем принимать решение о переходе с ArrayList .

Если вы не хотите использовать карту (не знаете, почему это было бы так), мой подход был бы следующим: Чтобы создать другой класс (позвоните на него CompanyJob), который будет содержать как компанию, так и атрибут Job, просто добавьте коллекцию Ваши экземпляры CompanyJob (например, ArrayList).

 class CompanyList{ private Company mCompany; private Job mJob; public CompanyList (Company com, Job job){ mCompany = com; mJob = job; } // Some logic ... } // Then your list private ArrayList<CompanyList> yourList = new ArraList <>(); int i = 0; for (Company tmpCom: companyList){ yourList.add (new CompanyJob (tmpCom,jobList.get(i)); i++; } 

Вам нужно создать новый

 List<String> third = new ArrayList<String>(); 

Также нужен счетчик.

 int position = 0; 

Затем перейдите по списку (учитывая, что размер одинаковый для обоих списков).

 for(String item:firstList){ third.add(item+ " : " + secondList.get(position); position ++; } 

Тогда третий будет иметь желаемый результат.

Подтвердить:

 for (String item:third){ //try to print "item" here }