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 は array[3]、次に 4、5、6、7、そして再び 2 になります。

どうもありがとうございました。

4

5 に答える 5

2

ここでの他の回答は良いですが、時代遅れのクラスを使用してください。

java.time

Java 8 以降では、java.time フレームワークが組み込まれています (Java 6 & 7 および Android 用のバックポート付き)。古い日時クラスに対する大幅な改善。

java.time クラスには、ニーズに正確に適合する 1 組のクラスが含まれています。

  • DayOfWeek
    月曜日から日曜日まで実行されるISO 8601標準で定義されているように、週の 7 日間のそれぞれを表す便利な列挙型。
  • LocalTime
    日付とタイム ゾーンのない時刻を表します。

これらのタイプが事前に定義されているため、他のコメントや回答で提案されているように、独自のクラスを定義する必要さえありません。少なくとも、日付の並べ替えの定義が月曜日から日曜日まで実行される場合。列挙型には、その順序で定義済みのDayOfWeek曜日があります。を組み合わせて独自のクラスを作成することができ、それが意味を成す場合は、より大きなプロジェクトになります。DayOfWeekLocalTime

Java 列挙型非常に便利で、柔軟性があり、強力です (そのため、初めて使用する場合は詳しく学んでください)。列挙型には、適切に名前が付けられたSetとの独自の特別な実装があります。を使用して各曜日を追跡し、時刻 (オブジェクト) にマッピングできます。MapEnumSetEnumMapEnumMapLocalTime

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 );

空のセットのペアを 1 つ作成して、今日と現在よりも同じまたは後の時刻を追跡し、もう 1 つを以前の時刻を追跡します。であるため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
于 2016-04-10T09:23:23.037 に答える
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 ...
    }
  });

}

ただし、他の人がコメントに書いているように、問題に対してよりオブジェクト指向のアプローチを取ることを強くお勧めします。

于 2013-05-29T09:39:11.283 に答える
1

ここでは、あなたには知られているがJavaには知られていない「仮想型構造」で配列を使用しないでください。厳密に型指定されたクラス モデリングを使用します。Comparableソート用に実装します。次に、コレクションを使用します。オブジェクト インスタンスを に追加し、そのメソッド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();
于 2013-05-30T09:23:35.883 に答える