【问题标题】:Array Sorting Using A Comparator in Java在 Java 中使用比较器进行数组排序
【发布时间】:2015-04-09 03:32:11
【问题描述】:

在我的程序中实现比较器时遇到问题。

这个程序最初是作为如何使用 swing 创建菜单的示例编写的。该程序只显示一个菜单、子菜单和带有标题、日期和工作室的电影列表。一个更大的数组将每部电影存储在它自己的数组中,包括它的标题、日期和工作室。

现在,我必须找到一种使用比较器对这些字符串进行排序的方法。像这样的:

Arrays.sort(data, new Comparator<String[]>() {

        public int compare(final String[] entry1, final String[] entry2) {
            final String field1 = entry1[0];
            final String field22 = entry2[0];
            return field1.compareTo(field2);
        }
    });

问题是,我从未使用过比较器,也不确定如何实现它。

我已经在下面添加了原程序的源代码。

我们将不胜感激。

谢谢。

编辑这个程序类似于 Java 教科书中的程序,但我们被明确告知不要像教科书那样解决排序问题。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

 class MenuExample extends Frame implements ActionListener
 {
     MenuBar mbar;
     Menu menu,submenu;
     MenuItem m1,m2,m3,m4,m5;

     public MenuExample ()
    {
         String[][] data = new String[][]
         {
             new String[] { "Casablanca", "Warner Brothers", "1942" },
             new String[] { "Citizen Kane", "RKO Pictures", "1941" },
             new String[] { "Singin' in the Rain", "MGM", "1952" },
             new String[] { "The Wizard of OZ", "MGM", "1930"}
         };

        // Set frame properties
        setTitle("AWT Menu"); // Set the title
        setSize(800,500); // Set size to the frame
        setLayout(new FlowLayout()); // Set the layout
        setVisible(true); // Make the frame visible
        setLocationRelativeTo(null);  // Center the frame

        // Create the menu bar
        mbar=new MenuBar();

        // Create the menu
        menu=new Menu("Menu");

        // Create the submenu
        submenu=new Menu("Sub Menu");

        // Create MenuItems
        m1=new MenuItem("Menu Item 1");
        m2=new MenuItem("Menu Item 2");
        m3=new MenuItem("Menu Item 3");

        m4=new MenuItem("Menu Item 4");
        m5=new MenuItem("Menu Item 5");
        m1.addActionListener(this);

        // Attach menu items to menu
        menu.add(m1);
        menu.add(m2);
        menu.add(m3);

        // Attach menu items to submenu
        submenu.add(m4);
        submenu.add(m5);

        // Attach submenu to menu
        menu.add(submenu);

        // Attach menu to menu bar
        mbar.add(menu);

        // Set menu bar to the frame
        setMenuBar(mbar);


        JPanel textPanel = new JPanel();

        JTextPane textArea = new JTextPane();


        Dimension textAreaDimensions = new Dimension(100, 300);
        textArea.setPreferredSize(textAreaDimensions);

        //width: 770 height: 1000
        JScrollPane scroll = new JScrollPane (textArea,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        Document doc=textArea.getDocument();
        try
        {
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<3;j++)
                doc.insertString(doc.getLength(),data[i][j]+"\t",
                textArea.getStyle("bold"));
                doc.insertString(doc.getLength(),"\n",
                textArea.getStyle("bold"));
            }//end for

        }//end try

        catch (Exception e) {}
        textPanel.add(scroll);
        add(textPanel);
        validate();
        repaint();
    }//end MenuExample

    public static void main(String args[])
    {
        new MenuExample();
    }//end main

    public void actionPerformed(ActionEvent e)
    {
        System.out.println(e.getActionCommand());
    }//end actionPerformed
}//end class

【问题讨论】:

  • 您要使用哪种排序顺序?
  • 你的意图不明确。您想对单个字符串数组进行排序吗?还是别的什么?
  • 这是我自己的一个问题。它没有具体说明,但我确信它应该是按标题、工作室或年份。也许也可以按字母顺序排列?
  • 我的意图并不明确,因为排序的规范非常模糊。我只是被告知使用比较器对数组进行排序。抱歉,我无法提供更多信息以说明如何
  • @ebonymessiah:如果 Daniel Nugent 的帖子帮助或解决了您的问题,请将他的帖子标记为已接受或最佳答案。

标签: java arrays string sorting comparator


【解决方案1】:

我只是把这个简单的例子放在一起来展示使用Comparator的两种不同方式:

import java.util.Arrays;
import java.util.Comparator;

public class ArraySort
{
  public static void main(String[] args)
  {
     String[][] data = new String[][]
         {
             new String[] { "Casablanca", "Warner Brothers", "1942" },
             new String[] { "Citizen Kane", "RKO Pictures", "1941" },
             new String[] { "Singin' in the Rain", "MGM", "1952" },
             new String[] { "The Wizard of OZ", "MGM", "1930"},
             new String[] { "AaaaaThe Wizard of OZ", "MGM", "1943"}
         };

     Arrays.sort(data, new Comparator<String[]>() {

        @Override
        public int compare(final String[] entry1, final String[] entry2) {
            final String field1 = entry1[0];
            final String field2 = entry2[0];
            return field1.compareTo(field2);
        }
     });

     print(data);

     System.out.println();

     Arrays.sort(data, new SortByDate());

     print(data);

     System.out.println();

     Arrays.sort(data, new SortByCompany());

     print(data);
  }

  public static void print(String[][] data){
    for (String[] array : data){
      for (String s : array){
        System.out.print(s + " ");
      }
      System.out.println();
    } 
  }

}

public class SortByDate implements Comparator<String[]>{
  @Override
  public int compare(final String[] entry1, final String[] entry2) {
    final String field1 = entry1[2];
    final String field2 = entry2[2];
    return field1.compareTo(field2);
  }
}

public class SortByCompany implements Comparator<String[]>{
  @Override
  public int compare(final String[] entry1, final String[] entry2) {
    final String field1 = entry1[1];
    final String field2 = entry2[1];
    return field1.compareTo(field2);
  }
}

输出:

AaaaaThe Wizard of OZ MGM 1943 
Casablanca Warner Brothers 1942 
Citizen Kane RKO Pictures 1941 
Singin' in the Rain MGM 1952 
The Wizard of OZ MGM 1930 

The Wizard of OZ MGM 1930 
Citizen Kane RKO Pictures 1941 
Casablanca Warner Brothers 1942 
AaaaaThe Wizard of OZ MGM 1943 
Singin' in the Rain MGM 1952 

The Wizard of OZ MGM 1930 
AaaaaThe Wizard of OZ MGM 1943 
Singin' in the Rain MGM 1952 
Citizen Kane RKO Pictures 1941 
Casablanca Warner Brothers 1942  

【讨论】:

  • @ebonymessiah 没问题,很高兴我能帮上忙!
【解决方案2】:

查看Comparator 的文档,您会注意到它是一个Java 接口,这意味着您可以创建一个实现Comparator.compare(T o1, T o2)Comparator.equals(Object obj) 方法的类。

因此,假设您将所有字符串属性封装在 Movie 对象中(我强烈推荐),您可以像这样实现 MovieNameComparator 类:

public class MovieNameComparator implements Comparator<Movie> {
  @override  
  public int compare(Movie m1, Movie2) {
    return m1.getName().compareToIgnoreCase(m2.getName());
  }

  @override
  public boolean equals(Movie otherMovie) {
    return this.getName().equals(otherMovie.getName());
  }
}

现在,您可以使用此比较器按电影名称对电影数组进行排序,如下所示:

Arrays.sort(data, new MovieNameComparator());

如果您想按其他电影属性排序,您可以按照相同的方法创建更多比较器类,例如MovieDateComparatorMovieProductionStudioComparator 等。

更新:根据要求,Movie 类可能类似于:

public class Movie{
  private String name;
  private String studio;
  private Date releaseDate;

  // add getters and setters here...
}

【讨论】:

  • “将所有字符串属性封装在一个电影对象中”到底是什么意思?我的数据对象中不是所有的字符串数据吗?
  • 创建一个类名Movie,并在那里定义所有属性。我在回答中包含了一个示例。
  • 这真的很有帮助。非常感谢!
  • @ebonymessiah 如果您喜欢,请考虑upvoting我的回答。
猜你喜欢
  • 2022-01-20
  • 2020-07-20
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多