【问题标题】:Sorting a matrix or 2d array by the content of a column按列的内容对矩阵或二维数组进行排序
【发布时间】:2015-10-24 20:18:05
【问题描述】:

我正在寻找一些代码帮助,以按一列的内容对矩阵内容进行排序,但保持同一行的数据...我将尝试展示一个示例:

初始矩阵为:

  • 1 - 玛莎 - 12321 - 18
  • 2 - 亚当 - 54345 - 22
  • 3 - 六月 - 76577 - 12
  • 4 - 托马斯 - 23454 - 16
  • 5 - 彼得 - 62356 - 24
  • 如您所见,第一列是职位,第二列是姓名,第三列是虚构的 ID,第四列是人的年龄。

    这是一个String数组,所以数值数据使用String.valueOf(number);进行转换

    现在,我想获得有关按任何列的内容对每一行进行排序的代码方面的帮助。

    例如,按名称列排序的行应该类似于:

  • 2 - 亚当 - 54345 - 22
  • 3 - 六月 - 76577 - 12
  • 1 - 玛莎 - 12321 - 18
  • 5 - 彼得 - 62356 - 24
  • 4 - 托马斯 - 23454 - 16
  • 现在,按 ID 列排序的行应该类似于:

  • 1 - 玛莎 - 12321 - 18
  • 4 - 托马斯 - 23454 - 16
  • 2 - 亚当 - 54345 - 22
  • 5 - 彼得 - 62356 - 24
  • 3 - 六月 - 76577 - 12
  • 如您所见,移动了整行,而不仅仅是单个列中的项目。

    有人可以帮助我吗?提前致谢。

    【问题讨论】:

      标签: java arrays string sorting matrix


      【解决方案1】:

      这是一个使用比较器和集合的快速解决方案。一切都应该是不言自明的。每个字段都是一个字符串,但您也可以轻松地使用整数。希望对您有用。

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.Comparator;
      import java.util.List;
      
      public class MatrixCompare {
      
          public static void main(String[] args) {
      
              List<Contact> contacts = new ArrayList<Contact>();
              contacts.add(new Contact("1", "John", "456456", "35"));
              contacts.add(new Contact("2", "Jack", "123123", "20"));
              contacts.add(new Contact("3", "Mary", "234234", "24"));
              contacts.add(new Contact("4", "Jane", "345345", "18"));
      
              System.out.println("Initial List\n");
              printContacts(contacts);
      
              System.out.println("\n\nSorted by Id\n");
              Collections.sort(contacts, new SortById());
              printContacts(contacts);
      
              System.out.println("\n\nSorted by Name\n");
              Collections.sort(contacts, new SortByName());
              printContacts(contacts);
      
              System.out.println("\n\nSorted by Person Id\n");
              Collections.sort(contacts, new SortByPersonId());
              printContacts(contacts);
      
              System.out.println("\n\nSorted by Age\n");
              Collections.sort(contacts, new SortByAge());
              printContacts(contacts);
      
          }
      
          private static void printContacts(List<Contact> contacts) {
              for (int i=0; i<contacts.size(); i++) {
                  System.out.println(contacts.get(i).id + " - " + contacts.get(i).name + " - " + 
                          contacts.get(i).getPersonId() + " - " + contacts.get(i).getAge());
              }
          }
      
          private static class Contact {
      
              String id;
              String name;
              String personId;
              String age;
      
              public Contact(String id, String name, String personId, String age) {
                  this.id = id;
                  this.name = name;
                  this.personId = personId;
                  this.age = age;
              }
      
              public String getId() {
                  return id;
              }
      
              public String getName() {
                  return name;
              }
      
              public String getPersonId() {
                  return personId;
              }
      
              public String getAge() {
                  return age;
              }
      
          }
      
          private static class SortById implements Comparator<Contact> {
              @Override
              public int compare(Contact o1, Contact o2) {
                  String name1 = o1.getId();
                  String name2 = o2.getId();  
                  return name1.compareTo(name2);
              }
          }
          private static class SortByName implements Comparator<Contact> {
              @Override
              public int compare(Contact o1, Contact o2) {
                  String name1 = o1.getName();
                  String name2 = o2.getName();    
                  return name1.compareTo(name2);
              }
          }
          private static class SortByPersonId implements Comparator<Contact> {
              @Override
              public int compare(Contact o1, Contact o2) {
                  String name1 = o1.getPersonId();
                  String name2 = o2.getPersonId();    
                  return name1.compareTo(name2);
              }
          }
          private static class SortByAge implements Comparator<Contact> {
              @Override
              public int compare(Contact o1, Contact o2) {
                  String name1 = o1.getAge();
                  String name2 = o2.getAge(); 
                  return name1.compareTo(name2);
              }
          }
      
      }
      

      【讨论】:

        【解决方案2】:

        由于二维数组实际上是一个数组数组,您可以通过调用Arrays.sort(array, comparator) 使用自定义Comparator&lt;String[]&gt; 对外部数组进行排序。

        【讨论】:

        • 能否更具体一些并帮助我编写代码?我对此一无所知。谢谢。
        • 也许你先试着写一些代码,如果你遇到麻烦再问另一个问题。这就是你学习的方式。当然,除非您不知道如何调用方法(sort()),或者如何实现接口(@98​​7654326@),在这种情况下,您应该阅读书籍或尝试教程。建议:首先阅读我为您提供的两个链接的 javadoc。
        • 我会尝试阅读一下。我知道如何对简单数组使用 sort() 方法,但我不知道如何实现 Comparator 接口以及如何使其对完整的行进行排序而不仅仅是对列进行排序。
        【解决方案3】:

        在 c# 中,您可以为特定类型的数组创建模型,然后可以使用 lambda 对其进行排序。
        经验。 OrderBy(p=> p.Name)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          • 1970-01-01
          • 1970-01-01
          • 2013-07-03
          • 2013-08-17
          • 2020-08-15
          • 2021-02-03
          相关资源
          最近更新 更多