【问题标题】:To sort an ArrayList of strings using an sorted ArrayList of integers使用已排序的整数 ArrayList 对字符串 ArrayList 进行排序
【发布时间】:2015-08-17 09:36:27
【问题描述】:

我有两个 ArrayList。一个具有整数值,另一个列表具有字符串。我必须在比较器接口中使用自定义排序来对整数 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));
    }
  } 
}

提前致谢。

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    您需要:

    1. 创建一个具有 2 个字段的自定义对象:IdName。让我们将此对象称为User
    2. List&lt;String&gt;List&lt;Integer&gt; 替换为List&lt;User&gt;
    3. 当用户输入数据时,不是添加到两个列表中,而是构造一个新的User 对象并将其添加到步骤 2 中创建的列表中。
    4. 让您的User 类实现Comparable 接口。 (implements Comparable&lt;User&gt;)。
    5. 在您的 compareTo 方法覆盖中,将当前对象的 Id 与您提供的对象进行比较。
    6. 拨打Collections.sortList&lt;User&gt;

    【讨论】:

      【解决方案2】:

      使用TreeMap&lt;Integer, String&gt; 不是更容易吗?当您添加到地图时,它会自动按 Key 排序。

      【讨论】:

      • 那行得通,但我想你的解决方案会超出这个问题的范围,我认为这是一个作业。
      • 使用用户定义的类手动重新创建 TreeSet 确实有点多余。
      【解决方案3】:

      您可以使用以下代码:

      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 个字段的类。

      打印出排序后的List改变你的显示方法:

      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 步输入输入吗(首先是所有 ID,而不是名称?...为什么不是 ID、名称、ID、名称等等。在这种情况下,您不需要 2列表)
      • 如果有 2 个具有相同 id 的项目会发生什么?

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 2015-07-14
        • 2011-07-28
        • 2016-09-06
        • 2017-02-23
        • 2018-04-21
        • 2017-06-07
        • 1970-01-01
        • 2015-10-06
        相关资源
        最近更新 更多