[英]How do I transverse a 2D array given an int top, bottom, left, and right?
[英]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
number
的Comparator
,然后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.