簡體   English   中英

如何按升序對段數組(int左,int右)進行排序,但是如果left(i)= left(i + 1)則按照right(i)和right(i + 1)對其進行排序

[英]How to sort an array of segments (int left, int right) in a ascending order but if left(i)=left(i+1) sort it acording to right(i) and right(i+1)

我有一個類Segment和這樣的細分數組:

private static class Segment {
        int number, type;
        Segment(int number, int type) {
            this.number = number;
            this.type = type;
        }
}

Segment[] points = new Segment[n];
points={(0,-1),(1,0),(5,1),(6,0),(6,-1),(10,1),(11,0)}

左邊的元素是點的列表,右邊的列表是點的類型:-1打開一個線段,1關閉一個線段,0與該線段相交。 如您所見,已經使用此代碼(經過改編的selectionSort)根據數字對該數組進行了排序:

maxI找到最大的“數字”元素的索引

private static int maxI(Segment[] segments, int size){
    int max=0;
    for (int i=0; i< size;i++){
        if(segments[i].number > segments[max].number ){
             max=i;
        }   
    }
    return max;
}

// swap方法在index1和index2之間交換數組的元素

private static void swap(Segment[] segments, int index1, int index2){
            int temp1; 
            int temp2;
            temp1 = segments[index1].number;
            temp2 = segments[index1].type;
            segments[index1].number=segments[index2].number;
            segments[index1].type=segments[index2].type;
            segments[index2].number=temp1;
            segments[index2].type=temp2;
    }

selectSort是排序方法(因為Arrays.sort不能與“ segments”一起使用)

private static void selectSort(Segment[] segments) {
        int MaxPos;
        for (int i=segments.length-1;i>0;i--){
            MaxPos = maxI(segments, i+1);
            swap (segments, MaxPos, i);
        }
}

原始輸入為2個范圍和3個交點:

Range 1: 0 5
Range 2: 6 10
Intersection points: 1 6 11

所以排序后,結果是:

(0,-1),(1,0),(5,1),(6,0),(6,-1),(10,1),(11,0)

我試圖修改maxI方法,所以6,-1在6,0(-1 <0)之前使用第二條if語句:

if (segments[i].number = segments[max].number && segments[i].type > segments[max].type)

但這會使輸出混亂。由於輸入是隨機的,因此必須准備代碼來對多個數字相等的測試用例進行排序。

我在這個主題上看到的最接近的問題是C ++提出的 ,因為我只是在學習Java,所以我很努力地嘗試理解C ++。 我覺得答案很接近,但是不確定我缺少什么,也許我使用了錯誤的數據結構。 之后,我只遍歷數組,將類型的總和相加,所以如果一個數字通過3個范圍的開頭(x,-1),則它是-3,絕對值= 3,所以它與3個范圍相交,這就是答案I需要。

只需創建一個Comparator numberComparator ,然后type ,然后可以使用Arrays.sort() 如果您有Java 8,則可以這樣進行:

Arrays.sort(points, Comparator.comparingInt((Segment s) -> s.number).thenComparingInt((Segment s) -> s.type));

如果您使用的是Java 7,則可以執行以下操作:

Arrays.sort(points, new Comparator<Segment>() {
    @Override
    public int compare(Segment s1, Segment s2) {
        int result = Integer.compare(s1.number, s2.number);
        if (result == 0) {
            result = Integer.compare(s1.type, s2.type);
        }
        return result;
    }
});

另外,您可以讓Segment實現Comparable接口,並且Arrays.sort(points)可以直接使用:

private static class Segment implements Comparable<Segment> {
    int number, type;
    Segment(int number, int type) {
        this.number = number;
        this.type = type;
    }

    @Override
    public int compareTo(Segment s) {
        int result = Integer.compare(this.number, s.number);
        if (result == 0) {
            result = Integer.compare(this.type, s.type);
        }
        return result;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM