【问题标题】:Sorting Parallel Arrays对并行数组进行排序
【发布时间】:2011-12-26 17:29:27
【问题描述】:

Java 初学者使用旧教科书和 Head First: Java 书籍来弄清楚一些东西。

我有三个平行的阵列。我需要能够根据用户选择按标题、作者或页数进行排序。我可以使用Arrays.sort() 对一个数组进行排序,但我对如何对其他两个数组进行排序以对应于新排序的数组感到困惑。

假设我对BookTitle 数组进行了排序,但我需要显示其各自数组的正确作者和页数,我很困惑。

do
{
    entry = JOptionPane.showInputDialog(null,
                                        "Enter your sort preference: \n" +
                                        "T = Sort by TITLE\n" +
                                        "A = Sort by AUTHOR\n" +
                                        "P = Sort by PAGE Count");

    c = entry.charAt(0);

    switch (c)
    {
    case 't':
    case 'T':
        Arrays.sort(BookTitle);
        for (int x = 0; x < BookTitle.length; x++)
        {
            msg += ("Title: " + BookTitle[x] + "\n");
        }
        JOptionPane.showMessageDialog(null, msg);
        isValid = true;
        break;

    case 'a':
    case 'A':
        isValid = true;
        break;

    case 'p':
    case 'P':
        isValid = true;
        break;

    default:
        JOptionPane.showMessageDialog(null, "Invalid entry");
        break;
    }
} while (isValid == false);

【问题讨论】:

  • 它们是否需要并行?因为最好的方法是拥有 1 个对象数组,其中每个对象包含标题、作者和页数。
  • 把它们都放在一个类中。对该类的对象数组进行排序。或类似的东西;我不知道Java。见stackoverflow.com/questions/4018090/…

标签: java arrays sorting


【解决方案1】:
public class SortUtils {
    public static void sort(long[] x, long[] y) {
        for (int i = 0; i < x.length; i++) {
            for (int j = i; j > 0 && x[j - 1] > x[j]; j--) {
                swap(x, j, j - 1);
                swap(y, j, j - 1);
            }
        }
    }

    private static void swap(long anArray[], int a, int b) {
        long t = anArray[a];
        anArray[a] = anArray[b];
        anArray[b] = t;
    }
}

【讨论】:

  • 实现冒泡排序通常是个坏主意,但在使用内置排序算法的语言(例如Arrays.sort)时尤其如此......
【解决方案2】:

您可以创建一个包含所有三个属性 Author、Title、Pages 的 Class。然后您可以创建 3 个比较器,它们将分别根据作者、标题和页面进行比较。然后您可以使用用户输入 T、A、P 就像您正在做的那样购买您必须使用相应的比较器对数组进行排序。伪代码如下:

Case A :
    Arrays.sort(ComparatorA);

case T:
    Arrays.sort(ComparatorT);

case P:
    Arrays.sort(ComparatorP);

【讨论】:

    【解决方案3】:

    第一个选项如上所示,将它们放入一个类中并使其与Why should a Java class implement comparable? 类似。

    这仅允许您比较一个值,我认为有一种方法可以选择要排序的内容,但我不知道。

    另一种方式...是实现您自己的排序方法。这可能需要一些工作,但至少做一次可能会很好,这样您就可以学习它。插入和选择排序很容易掌握,并且允许您并行移动每个数组中的元素。

    更新:如上所述,您可以拥有多个比较器,请查看 this 网站,因为它似乎拥有您需要的一切。

    【讨论】:

      【解决方案4】:

      改编自@ScottStanchfield 的这篇文章:sorting List<Class> by one of its variable

      public class Book {
          String author;
          String title;
          String pages;
      }
      
      Collections.sort(list, new Comparator<Book>() {
          public int compare(Book c1, Book c2) {
              if (c1.pages > c2.pages)
                  return -1;
              if (c1.pages < c2.pages)
                  return 1;
              return 0;
          }
      });
      
      Book[] books;
      Collections.sort(books);
      

      本人不懂Java,如有错误请指正!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        相关资源
        最近更新 更多