2014-04-04 56 views
0

比较从发布我原来的,发现了一个问题,修订处Sorting Arrays Using Variables Within the Array 基本上,我似乎无法找到基于我Event类的eventCodeString排序我的阵列的方法。由于字符串是字母数字(例如A123,B321,C222),传统比较器(我刚发现,感谢原始帖子中的人员)不起作用。我遇到并尝试实施的解决方案越多,我就越困惑。请帮助我理解涉及字符串的数组对象比较的逻辑。字母数字串从对象数组

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

    public static void main(String[] args) 
    { 
     callMotto(); 
       int x, sortMethod; 
       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 
       do 
       { 
        String sorting; 

        sorting = JOptionPane.showInputDialog("Please choose sorting method:\n" 
          + "1 to sort by event number\n" 
          + "2 to sort by number of guests\n" 
          + "3 to sort by event type\n" 
          + "Type 99 to exit sorting list"); 
        sortMethod = Integer.parseInt(sorting); 
        //Event code sorting start 
        if(sortMethod == 1) 
        { 
         for(x = 0; x < 8; ++x) 
         { 

         } 
        } 
        //Event code sorting end 
        if(sortMethod == 2) 
        { 
         for(x = 0; x < 8; ++x) 
         { 
          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; 
           }         
          }); 
          eventStuff[x].largeParty(); 
         } 
        } 
        //Event type sorting start 
        if(sortMethod == 3) 
        { 
         for(x = 0; x < 8; ++x) 
         { 
          Arrays.sort(eventStuff, new Comparator<Event>() 
          { 
           @Override 
           public int compare(Event o1, Event o2) 
           { 
            if (o1.getEventStr() < o2.getEventStr()) 
             return -1; 
            else if (o1.getEventStr() == o2.getEventStr()) 
             return 0; 
            else 
             return 1; 
           }         
          }); 
          eventStuff[x].largeParty(); 
         } 
        //Event type sorting end 
       //Sorting method end 
        } 
        if(sortMethod == 99) 
         System.exit(0); 
       } 
       while(sortMethod != 99); 
     } 
    public static void callMotto() 
    { 

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

    } 

} 
+0

什么你想要什么样的排序,简单的字符值排序,还是你想要的,例如“X-123”在“X-13”之后排序? –

+0

我需要数组排序如下:假设用户输入一些任意值,比如B111,A222,C333,C222,E555和E111,我希望输出为A222,B111,C222,C333,E111,E555。 –

+0

这只是普通的字母数字排序,有什么难度?你只需要明白,只有“基元”可以与'><=='进行比较,而对于需要使用特定于对象的'比较'方法的对象。 'String'有这样一种方法,名为'compareTo',或者如果你愿意,你可以使用'compareToIgnoreCase'。 –

回答

2

很简单,因为你不能比较使用==String S,你应该使用String#equals代替。 <,<=,!=,>>=也是如此。
你可以参考this other StackOverflow question的解释。

也就是说,你必须更换:

Arrays.sort(eventStuff, new Comparator<Event>() { 
    @Override 
    public int compare(Event o1, Event o2) 
    { 
     if (o1.getEventStr() < o2.getEventStr()) 
      return -1; 
     else if (o1.getEventStr() == o2.getEventStr()) // this line 
      return 0; 
     else 
      return 1; 
    }         
}); 

由:

Arrays.sort(eventStuff, new Comparator<Event>() { 
    @Override 
    public int compare(final Event o1, final Event o2) { 
     return o1.getEventStr().compareTo(o2.getEventStr)); 
    }         
}); 

String#compareTo(String)方法来自于一个事实,即Java的String小号实施Comparable<String>,这基本上意味着他们天生知道如何比较自己。


因为我在的话,我建议你也更改Comparator的执行情况的客人数:

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

将变成:

return o1.getGuests() - o2.getGuests; 

如果您认为关于它,它的确会:

  • 回报负值o1.getGuests() < o2.getGuests()
  • 回报时o1.getGuests() == o2.getGuests()
  • 回报正值o1.getGuests() > o2.getGuests()

...这正是我们所需要:)

+0

您不仅回答了我的问题,还清理了我的代码。谢谢你的帮助,我已经在这里待了5个小时。 –