2013-03-14 18 views
1

說我有一個「數字」對象的數組與「startNo」整數和「endNo」整數。邏輯 - 需要找到重疊的數字範圍

在數組中可以有多個「數字」,我想獲得一個新的數組,修改後的對象將只有沒有重疊的範圍。

對於例如:如果數組有:

number 
(startNo:1 endNo:3) 
(startNo:1 endNo:7) 
(startNo:2 endNo:9) 
(startNo:15 endNo:18) 
(startNo:50 endNo:60) 
(startNo:55 endNo:65) 

我希望得到一個這樣的數組:

number 
(startNo:1 endNo:9) 
(startNo:15 endNo:18) 
(startNo:50 endNo:65) 

我一直與結構,維權和一切,但不同的方法試圖手我所得到的只是多層次的混淆。

我客觀-C平臺的工作是否有幫助

補充:起始頁可以是一個很大的數,ENDPAGE可以是一個小數目。

回答

0

//它是用C#語言編寫的。但是概念可以用任何編程語言來實現。

public class Range 
{ 
    public int startNo { get; set; } 
    public int stopNo { get; set; } 

    public Range(int start, int stop) 
    { 
     startNo = start; 
     stopNo = stop; 
    } 
} 

     public void GetUniqueRanges() 
    { 
     var rangeList = new List<Range>(); 
     rangeList.Add(new Range(7,4)); 
     rangeList.Add(new Range(3, 15)); 
     rangeList.Add(new Range(54, 35)); 
     rangeList.Add(new Range(45, 60)); 
     rangeList.Add(new Range(60,75)); 
     rangeList.Add(new Range(76,100)); 
     rangeList.Add(new Range(6,10)); 
     rangeList.Add(new Range(16,24)); 
     rangeList.Add(new Range(19,34)); 

     var sorted = new List<Range>(); 
     foreach (var range in rangeList) 
     { 
      var item = new Range(Math.Min(range.startNo, range.stopNo), Math.Max(range.startNo, range.stopNo)); 
      sorted.Add(item); 
     } 
     var result = new List<Range>(); 
     sorted = sorted.OrderBy(x => x.startNo).ToList(); 
     var counter = sorted.Count; 
     for (var i = 0; i < counter;) 
     { 
      var item = new Range (sorted[i].startNo, sorted[i].stopNo); 
      var j = i + 1; 
      for (; j < counter; j++) 
      { 
       if (sorted[j].startNo <= item.stopNo) 
       { 
        item.stopNo =Math.Max(item.stopNo, sorted[j].stopNo); 
       } 
       else 
       { 

        break; 
       } 
      } 
      i = j; 
      result.Add(item); 
     } 
    } 
+0

它在目標c中沒有在java或c#中。 NSFeaster無法將c#API轉換爲目標c。 – 2013-03-14 16:45:13

+0

嗨Vijay,非常感謝。雖然這是C#,但我明白了邏輯。這個解決方案是最緊湊的,並且有更少的循環,所以我會接受這個答案是正確的。 – NSFeaster 2013-03-15 13:44:38

2

這是一個經典算法過程的問題..

排序陣列由降序第一(最小)值的順序。 跟蹤兩個變量:開始段,結束段。

每一轉都選擇一個數組,並檢查開始和結束的數字,並找出該段中是否有 。

這樣就可以找到重疊

好運

+0

感謝您的回覆。我無法得到「跟蹤兩個變量」 – NSFeaster 2013-03-14 10:11:09

+0

正如上面提到的那樣,這只是段/數組的邊界。 – drtf 2013-03-14 11:13:25

+0

請參閱修訂後的問題。 – NSFeaster 2013-03-14 11:14:52

1

一個簡單的方法來解決這個問題:

  1. 創建一個新的空數組(我們將其命名爲:TMP)。
  2. 把第一陣列的startNoendNo to tmp。
  3. 第二陣列的startNoendNo。然後,決定它們是否與tmp中的重疊。 (如果它們不重疊,則在tmp末尾插入它們兩個)。
  4. 對每個數組重複上述步驟。
  5. tmp現在將保持所有範圍不重疊。
+0

請參閱修訂後的問題。 – NSFeaster 2013-03-14 11:15:17

+0

您只需要弄清楚如何確定它們是否重疊。想想可能發生的情況。 – 2013-03-14 11:32:41

+1

感謝您的回覆。非常感激。 – NSFeaster 2013-03-15 15:10:08

1

只是快速的想法沒有經過測試:

1.Get最小起始號碼說SN和相應的末尾沒有說恩。

2.如果開始no小於sn,則檢查下一個對象,然後忽略開始no。如果結束號碼大於en,則將新的結束號碼存儲到您的en。

3.這會給你你的對象。

4。如果起始數字大於en,則創建一個新對象以添加到數組中。

這應該工作.tell我,如果你有進一步的問題

+0

請參閱修訂後的問題 – NSFeaster 2013-03-14 11:29:51

2

假設你的類是通過myNumbers是這樣的:

@interface MyNumbers : NSObject 
@property NSInteger startNumber; 
@property NSInteger endNumber; 

- (id)initWithStartNumber:(NSInteger)start withEnd:(NSInteger)end; 

@end 

而且方式合併:

- (void)yourMethod{ 

    MyNumbers *obj1=[[MyNumbers alloc]initWithStartNumber:1 withEnd:3]; 
    MyNumbers *obj2=[[MyNumbers alloc]initWithStartNumber:1 withEnd:7]; 
    MyNumbers *obj3=[[MyNumbers alloc]initWithStartNumber:2 withEnd:9]; 
    MyNumbers *obj4=[[MyNumbers alloc]initWithStartNumber:15 withEnd:18]; 
    MyNumbers *obj5=[[MyNumbers alloc]initWithStartNumber:50 withEnd:60]; 
    MyNumbers *obj6=[[MyNumbers alloc]initWithStartNumber:55 withEnd:65]; 

    NSArray *[email protected][obj1,obj2,obj3,obj4,obj5,obj6]; 
    NSMutableArray *mergedArray=[NSMutableArray arrayWithObject:array[0]]; 

    for (NSInteger index=1; index<array.count; index++) { 
     MyNumbers *currentNumber=array[index]; 
     MyNumbers *previousNumber=array[index-1]; 

     if (currentNumber.startNumber<=previousNumber.endNumber) { 
      previousNumber.endNumber=currentNumber.endNumber; 
      [mergedArray replaceObjectAtIndex:mergedArray.count-1 withObject:previousNumber]; 
     } 
     else{ 
      [mergedArray addObject:currentNumber]; 
     } 
    } 

    for(MyNumbers *element in mergedArray){ 
     NSLog(@"startNo:%d endNo:%d",element.startNumber, element.endNumber); 
    } 
} 

輸出:

 
2013-03-14 17:14:05.040 Inheritance[34234:303] startNo:1 endNo:9 
2013-03-14 17:14:05.041 Inheritance[34234:303] startNo:15 endNo:18 
2013-03-14 17:14:05.041 Inheritance[34234:303] startNo:50 endNo:65 
+0

很好的回答Anoop。感謝代碼。另一個答案處理了這樣的情況,即在我的一些情況下,數字將不按增量順序排列,起始數字大於結束數字。謝謝你的回答。非常感激。 :) – NSFeaster 2013-03-15 14:54:07

+0

我解決你的問題。如果你已經說過,在沒有排序的情況下,在Obj-C中只需要一行額外的語句。你標記爲obj-c。不是C#。無論如何,這是最好的,最好的。 – 2013-03-15 15:47:13

+0

我想你是對的。請添加該行代碼以進行存檔,我會將您的答案標記爲已接受。還請注意,如果一個數字範圍位於現有單位範圍之間(例如:5-10和2-14),那麼也可能會失敗。我還沒有讓它在機器上運行。再次感謝您的幫助。 – NSFeaster 2013-03-15 19:52:53