2015-08-17 5 views
-3

У меня есть два списка ArrayLists. Один с целыми значениями, а другой список имеет строку. Я должен использовать пользовательский сортировку в интерфейсе компаратора для сортировки целочисленного ArrayList, чтобы строка ArrayList сортировалась на основе этого. Как изменить следующий код, чтобы найти решение с помощью Comparator.Чтобы отсортировать ArrayList строк, используя отсортированный массив ArrayList целых чисел

import java.util.*; 

class ListTask 
{ 
    public static void main(String[] args) 
    { 
    List<String> l2 = new ArrayList(); 
    List<Integer> l1 = new ArrayList(); 
    Scanner in = new Scanner(System.in); 
    boolean err = false; 
    int n; 
    do 
    { 
     try 
     { 
     System.out.println("Please enter the number of values to be entered"); 
     //to find the length of 2 lists l1 and l2 
     n= in.nextInt(); 
     //add values to l1 
     System.out.println("Please enter the id "); 
     for(int i=0;i<n;i++) 
     { 
      l1.add(in.nextInt()); 
      //to add values to l2 
      System.out.println("Please enter the name"); 
      for(int i=0;i<n;i++) 
      { 
      l2.add(in.next()); 
      err = false; 
      } 
     } 
     } catch(Exception e) { 
     System.out.println("Please enter a valid input"); 
     } 
    } while(err); 

    //code to sort list l2 based on the list l1 
    for(int i=0;i<l1.size();i++) 
    { 
     for(int j=i+1;j<l1.size();j++) 
     { 
     if((l1.get(i)) > (l1.get(j))) 
     { 
      Collections.swap(l1, i, j); 
      Collections.swap(l2, i, j); 
     } 
     } 
    } 
    //displays the sorted values 
    display(l1, l2); 
    } 

    public static void display(List l1, List l2) 
    { 
    System.out.println("The sorted List is"); 
    for(int i=0;i<l1.size();i++) 
    { 
     System.out.println("Id= "+ l1.get(i) + " Name= " + l2.get(i)); 
    } 
    } 
} 

Заранее спасибо.

+0

@khelwood Исправлено. – reporter

ответ

0

Не было бы проще использовать TreeMap<Integer, String>? Когда вы добавляете карту, она автоматически сортируется по клавише.

+0

Это сработает, но я полагаю, что ваше решение выходит за рамки этой проблемы, и я полагаю, что это задание. – npinti

+0

Несомненно, воссоздание TreeSet вручную с использованием классов, определенных пользователем, будет немного избыточным. –

2

Вам нужно:

  1. Создать пользовательский объект, который имеет 2 поля: Id и Name. Назовем этот объект User.
  2. Заменить List<String> и List<Integer> с List<User>.
  3. Когда пользователь вводит данные, а не добавлять к двум спискам, построить новый объект User и добавить его в список, созданный на шаге 2.
  4. Сделайте свой User класс реализует интерфейс Comparable. (implements Comparable<User>).
  5. В вашем compareTo методе переопределения сравнить Id текущего объекта с тем, который вы предоставили.
  6. Звоните Collections.sort на номер List<User>.
0

Вы можете использовать следующий код:

List<Pair<Integer, String>> l1l2 = new ArrayList<>(); 
    for (int i = 0; i < l1.size(); i++) { // I asume that l2 has the same length as l1 
     l1l2.add(new Pair<>(l1.get(i), l2.get(i))); 
    } 
    Collections.sort(l1l2, Comparator.comparing(Pair::getKey)); 

Вместо Pair вы также можете сделать свой собственный класс, который имеет 2 поля.

распечатать отсортированный список изменить способ отображения:

public static void display(List<Pair<Integer, String>> l1l2) { 

    System.out.println("The sorted List is"); 
    for (int i = 0; i < l1l2.size(); i++) 
     System.out.println("Id= " + l1l2.get(i).getKey() + " Name= " + l1l2.get(i).getValue()); 

} 

вы должны думать о том:

  • сделать вам действительно нужно ввести входы в 2 разделенных stepps (первые все идентификаторы чем имена? ... почему не ID, имя, идентификатор, имя и т. д. В этом случае вам не нужны 2 списка)
  • что должно произойти, если есть 2 элемента с одинаковым идентификатором?
Смежные вопросы