我有两个ArrayLists。一个具有整数值,另一个列表具有字符串。我必须在比较器接口中使用自定义排序来对整数ArrayList进行排序,以便字符串ArrayList根据它进行排序。如何更改以下代码以使用Comparator查找解决方案。
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 :(得分:2)
您需要:
Id
和Name
。我们称这个对象为User
。List<String>
和List<Integer>
替换为List<User>
。User
对象并将其添加到步骤2中创建的列表中。User
类实现Comparable
接口。 (implements Comparable<User>
)。compareTo
方法覆盖中,将当前对象的Id
与您提供的对象进行比较。List<User>
上的Collections.sort
。答案 1 :(得分:0)
使用TreeMap<Integer, String>
会不会更容易?当您添加到地图时,它将自动按键排序。
答案 2 :(得分: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));
您可以创建自己的有2个字段的类,而不是Pair
。
打印出已排序的列表更改显示方法:
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());
}
你必须考虑: