【问题标题】:Sorting Arrays Using Variables Within the Array使用数组中的变量对数组进行排序
【发布时间】:2014-04-04 17:08:06
【问题描述】:

首先,我对我对 Java 及其术语的了解不足表示歉意。我将尽我所能。我正在尝试通过存储在数组中的变量对下面的数组eventStuff 进行排序。我为用户提供了三个选项可供选择,一个事件编号(字母,数字 x 3)、输入的客人数量(包括 5 到 100 个)和一个事件类型(包括 1 到 4 个)。我目前正在遭受如何做到这一点的完全精神障碍。我是否错误地设置了数组,或者有没有更简单的方法可以使用我目前所拥有的东西来做到这一点?感谢您的帮助!

更新:所以我已经掌握了所有数字排序,但字母数字(例如 A111)eventCodeString 超出了我的范围。我检查了几个论坛并应用了许多合理的解决方案,但它们要么无效要么抛出错误。在这一点上,我不确定我应该做什么。

package Chapter9;
import Chapter9.Event;
import javax.swing.JOptionPane;
import java.util.Arrays;
public class EventDemo
{

    public static void main(String[] args)
    {
        callMotto();
                int x;
                Event[] eventStuff = new Event[8];
                for(x = 0; x < 8; ++x)
                {
                    eventStuff[x] = new Event();
                    eventStuff[x].setEventCodeString();
                    eventStuff[x].setGuests();
                    eventStuff[x].setContactNumber();
                    eventStuff[x].setEventStr();
                }
                //Sorting method start
                    String sorting;
                    int sortMethod;

                    sorting = JOptionPane.showInputDialog("Please chooose sorting method:\n"
                            + "1 to sort by event number\n"
                            + "2 to sort by number of guests\n"
                            + "3 to sort by event type");
                    sortMethod = Integer.parseInt(sorting);
                    //Event number sorting start
                    if(sortMethod == 1)
                    {

                    }
                    //Event number sorting end
                    //Event guest sorting Start
                    if(sortMethod == 2)
                    {

                    }
                    //Event guest sorting end
                    //Event type sorting start
                    if(sortMethod == 3)
                    {

                    }
                    //Event type sorting end
                //Sorting method end
    }

    public static void callMotto()
    {

        JOptionPane.showMessageDialog(null, "*******************************************************\n"
                        +   "* Carly's Makes The Food That Makes The Party! *\n"
                        +   "*******************************************************");

    }

    }   

【问题讨论】:

  • 由于看不到setEventCodeString等方法,所以无法判断数组是否设置正确,但应该没问题。为每个数组元素单独调用new 看起来很糟糕:为什么不在循环内eventStuff[x] = new Event();?要提供不同的排序方法,Event 需要不同的Comparators。请阅读this tutorial,尤其是Comparator部分。
  • 太好了,我会立即研究 Comparator。我将修改我的代码以反映您的建议。我最初确实尝试了eventStuff[x] = new Event();,但收到了一个奇怪的错误。我没有进行故障排除,而是绕过它。糟糕的表演。
  • @Blaine 不,这没有任何区别。

标签: java arrays sorting


【解决方案1】:

使用带有ComparatorArrays.sort(),然后根据选择创建一个Comparator&lt;Event&gt;,它根据所选的排序键比较两个Event,例如:

class EventNumberComparator implements Comparator<Event> {
    @Override public int compare (Event a, Event b) {
        // for example:
        return Integer.compare(a.getEventNumber(), b.getEventNumber()); 
        // optionally: be sure to handle nulls if null Events are possible
    }
}

那么,如果用户选择事件编号:

Arrays.sort(theArray, new EventNumberComparator());

或者,例如:

Comparator<Event> comparator = null;

if (sortMethod == 1)
    comparator = new EventNumberComparator();
// etc...

if (comparator != null)
    Arrays.sort(theArray, comparator);

或上述多种可能版本中的任何一种;要点是 Comparator 根据某个键比较两个 Events,然后您使用该 Comparator 来定义数组的排序顺序。如果您不想就地排序,请先创建数组的副本并对其进行排序,尽管这对您的应用程序来说似乎很好。您还可以使用容器,例如ArrayList,如果你愿意的话。

查看comparators 上的官方教程(请参阅底部的比较器部分,而不是顶部的“可比较”部分)。

【讨论】:

  • 谢谢你,Jason C,但我会说实话;这有点超出我的想象。我可以得到一个纲要或一个例子吗?
  • @CoreyMcDonald 添加了示例 sn-ps;并且一定要看看那个教程。
【解决方案2】:

例如,如果您想根据客人数量对数组进行排序,您可以使用类似的方法:

    Arrays.sort(eventStuff, new Comparator<Event>() {

        @Override
        public int compare(Event o1, Event o2) {

            if (o1.getGuests() < o2.getGuests())
                return -1;
            else if (o1.getGuests() == o2.getGuests())
                return 0;
            else
                return 1;

        }                                   
    });

我想getGuests 返回客人的数量。

【讨论】:

  • +1 匿名类可能更符合 OP 的喜好。
  • 有像Integer.compare 这样的内置方法可以完成您在示例中所做的工作,这样可以使事情变得更简单。但是由于 OP 仍在学习中,所以最好展示一下事情是如何工作的细节。
  • 所以我对Comparator&lt;&gt; 的工作原理有了非常非常基本的了解,实际上我已经在我的三个排序字段中的两个字段中实现了它。但是,我的 eventCodeStrings 是字母数字格式(例如 A111)。对于这种情况,我该如何比较它们?
  • 您需要按字典顺序对字符串进行排序吗?
  • 是的,只要我对字典顺序的理解是正确的;如:A111 before B111 and C111 before C222
猜你喜欢
  • 2011-12-05
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2012-09-29
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多