2013-05-29 130 views
3

第一:我使用的信息一个数组是这样的:爪哇 - 按时间排序阵列

// Tuesday 
array[2][1] = "tuesday"; 
array[2][2] = "20:00"; 

// Wednesday 
array[3][1] = "Wednesday"; 
array[3][2] = "15:00"; 

// Thursday 
array[4][1] = "Thursday"; 
array[4][2] = "20:00"; 

// Friday 
array[5][1] = "Friday"; 
array[5][2] = "18:00"; 

// Saturday 
array[6][1] = "Saturday"; 
array[6][2] = "15:00"; 

// Sunday 
array[7][1] = "Sunday"; 
array[7][2] = "15:00"; 

我如何可以按实际时间和工作日的阵列?例如:现在是星期三 - 11:13。第一个Array-Item将是数组[3],然后是4,5,6,7,然后是2.

非常感谢。

+12

您的代码受* Object Denial *异味的影响,这会使得包括当前问题在内的一切都变得更加困难。 Java希望你写类,不要抗拒。 –

+0

+1 @MarkoTopolnik – DaGLiMiOuX

+0

今天是星期三 - 德国时间11:35。 3(今天15:00),4(星期三是星期四之后),5,6,7,2(星期日之后是(在这个阵列中)星期二(星期一))。我编辑我的问题:实际上是时间和周日。 – user1878413

回答

2

这里其他的答案是好的,但使用过时的类。

java.time

利用Java 8后来我们现在有java.time框架内置(背部端口的Java 6 & 7和Android)。与以前的日期时间课程相比有了很大的改进。

的java.time类包括一对类适合您的具体需求:

  • DayOfWeek
    一个方便enum代表各一周七天的,由ISO 8601标准运行的定义周一至周日。
  • LocalTime
    表示没有日期和时区的时间。

有了这些类型的预定义,您甚至不需要根据其他评论和答案的建议来定义自己的类。至少如果你的排序的定义周一至周日。 DayOfWeek枚举按该顺序具有预定义的几周。你可能让你自己的班级结合DayOfWeekLocalTime如果它是有意义的更大的项目。

Java enums真的方便,灵活,功能强大(所以learn more如果他们是新的给你)。枚举有其自己的特殊实现SetMap,命名适当,EnumSetEnumMap。我们可以使用EnumMap来跟踪一周中的每一天,将其映射到一天的时间(一个LocalTime对象)。

EnumMap<DayOfWeek , LocalTime> dayToTimeMap = new EnumMap<> (DayOfWeek.class); 

dayToTimeMap.put (DayOfWeek.TUESDAY , LocalTime.parse ("20:00")); 
dayToTimeMap.put (DayOfWeek.WEDNESDAY , LocalTime.of (15 , 0)); 
dayToTimeMap.put (DayOfWeek.THURSDAY , LocalTime.parse ("20:00")); 
dayToTimeMap.put (DayOfWeek.FRIDAY , LocalTime.parse ("18:00")); 
dayToTimeMap.put (DayOfWeek.SATURDAY , LocalTime.parse ("15:00")); 

获取当前的星期几和每日时间。

DayOfWeek today = DayOfWeek.WEDNESDAY; 
LocalTime now = LocalTime.of (11 , 13); 

做一空套一个跟踪一天的时间是相同或迟于今天,现在,和一个跟踪较早天时间。作为EnumSet,它们的自然顺序是在DayOfWeek枚举中声明的顺序(周一至周日,1-7)。

EnumSet<DayOfWeek> earlier = EnumSet.noneOf (DayOfWeek.class); 
EnumSet<DayOfWeek> later = EnumSet.noneOf (DayOfWeek.class); 

将DayOfWeek-to-LocalTime地图循环。查看DayOfWeek是在今天之前,等于还是晚于今天。如果等于今天,则将其对象LocalTime与我们的now对象进行比较。将此DayOfWeek对象分配给earlier集合或later集合。

for (Map.Entry<DayOfWeek , LocalTime> entry : dayToTimeMap.entrySet()) { 
    DayOfWeek key = entry.getKey(); 
    LocalTime value = entry.getValue(); 
    int comparison = key.compareTo (today); 
    if (comparison < 0) { // if earlier day… 
     earlier.add (key); 
    } else if (comparison == 0) { //If same day… 
     if (value.isBefore (now)) { 
      earlier.add (key); 
     } else { // Else same time as now or later than now… 
      later.add (key); 
     } 
    } else if (comparison > 0) { 
     later.add (key); 
    } else { 
     throw new RuntimeException ("Unexpectedly reached IF-ELSE for comparison: " + comparison); 
    } 
} 

转储到控制台。我们要循环设置later,然后按照问题中列出的要求设置earlier

System.out.println ("dayToStringMap: " + dayToTimeMap); 
System.out.println ("sorted by today: " + today + " " + now + " is: "); 
for (DayOfWeek dayOfWeek : later) { 
    LocalTime localTime = dayToTimeMap.get (dayOfWeek); 
    System.out.println (dayOfWeek + " " + localTime); 
} 
for (DayOfWeek dayOfWeek : earlier) { 
    LocalTime localTime = dayToTimeMap.get (dayOfWeek); 
    System.out.println (dayOfWeek + " " + localTime); 
} 

运行时。

dayToStringMap: {TUESDAY=20:00, WEDNESDAY=15:00, THURSDAY=20:00, FRIDAY=18:00, SATURDAY=15:00} 
sorted by today: WEDNESDAY 11:13 is: 
WEDNESDAY 15:00 
THURSDAY 20:00 
FRIDAY 18:00 
SATURDAY 15:00 
TUESDAY 20:00 
3
class CalendarEntry implements Comparable<CalendarEntry> { 
    String entry; 
    Date start; 

    // constructors, getters, setters 

    int compareTo(CalendarEntry o) { 
    if (o==null) return 1; 
    return start.compareTo(o.start); 
    } 

} 

List<CalendarEntry> entriesList = new ArrayList<CalendarEntry>(); 
// add contents 
Collections.sort(entriesList); 
// and you are done 
6

您应该使用Arrays.sort(array,comparator),例如,是这样的:

Arrays.sort(array, new Comparator<String[]>() { 
    public int compareTo(String[] one, String[] two) { 
     // implement compareTo here 
    } 
}); 

但它是非常不好的做法,使用不同的数据,而不是自定义类型的一个维数组二维数组,即:

public class DayTime { 
    private String day; 
    private String time; 
    // constructors, setters, getters 
} 

现在这个样子创建数组:

DayTime[] days = new DayTime[] { 
    new DayTime("tuesday", "20:00"). 
    new DayTime("Wednesday", "15:00"), 
    // etc, etc 
}; 


Arrays.sort(array, new Comparator<DayTime>() { 
    public int compareTo(DayTime one, DayTime two) { 
     // implement compareTo here 
    } 
}); 

您还可以使DateTime实施Comparable。在这种情况下,只需要调用

1

排序本身可以通过使用Arrays.sort用自己的Comparator

http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

public static void main(String[] args) { 

    String[][] array = createArray(); 

    Arrays.sort(array, new Comparator<String[]>() { 
    @Override public int compare(String[] o1, String[] o2) { 
     String day1 = o1[0]; 
     String day2 = o2[0]; 
     String time1 = o1[1]; 
     String time2 = o2[1]; 

     // Perform comparison, first of the days, then - if they're 
     // identical of the times. 
     return ... 
    } 
    }); 

} 
实现

然而,正如其他人写的评论:我强烈建议采取更加面向对象的方法解决问题。

1

不要在这里使用一个数组,这里有一些已知的“虚拟类型结构”,但不能用于java。使用强类型的类建模。执行Comparable进行排序。然后使用collections - 将对象实例添加到List并使用它的sort方法。

class Event implements Comparable<Event> { 
    String day; 
    String time; 

    public Event(String day, String time) { this.day = day; this.time = time; } 
    public String getDay() { return this.day; } 
    public String getTime() { return this.time; } 

    @Override 
    public boolean equals(Object other) { 
     boolean result = false; 
     if (other != null && other instanceof Event) { 
      Event otherEvent = (Event)other; 
      result = this.getDay().equals(otherEvent.getDay()) && 
        this.getTime().equals(otherEvent.getTime()); 
     } 
     return result; 
    } 

    @Override 
    public int hashCode() { 
     return this.getDay().hashCode()*7 + this.getDay().hashCode(); 
    } 

    @Override 
    public int compareTo(Event otherEvent) { 
     int result = this.getDay().compareTo(otherEvent.getDay()); 
     if (result == 0) result = this.getTime().compareTo(otherEvent.getTime()); 
     return result; 
    } 
} 

然后在其它的类或主要方法:

List<Event> eventList = new ArrayList<Event>(); 
eventList.add(new Event("tuesday","20:00")); 
eventList.add(new Event("tuesday","20:00")); 
// etc 

eventList.sort();