2015-11-14 58 views
1

我正試圖編寫一個算法來從特定索引處的名稱列表中刪除名稱。最初我會逐行閱讀文件。該文件將是這樣的:在特定索引處從字符串數組中刪除字符串

amelie barbon cat dog thomas | 3 
raty pertw ituy |5 

現在,比如說我們看到我們三(3)最後有第一線,所以在這裏我們不得不在最後讀出數字的每一行,這個數字是blackNumber,這麼叫,因爲在讀取這個數字之後,我們必須逐個刪除這個索引處的每個字符串,直到字符串數組中剩下1個字符串。只有左邊的字符串是我們的答案。

例如: Cat將在第一次迭代中被刪除,並且該列表將成爲

amelie barbon dog thomas

現在dog將被刪除,然後thomas,這兩個類似的刪除後的名單將是:

amelie barbon 

到此爲止我的代碼工作正常,但現在我們必須刪除索引3和 但也有2個元素只有在列表中,這樣下次刪除櫃檯已開始像這樣:

amelie(index:1)-> barbon(index:2)->amelie(index:3) 

和字符串amelie必須被刪除,這將在列表中保持barbon,這就是答案。 (當列表元素總數少於blackNumber時,這最後一步,那麼我不能得到如何做的邏輯)。

我曾嘗試爲如下:(這將無限運行時表計數值比blackNumber小)

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (StreamReader reader = File.OpenText("C:\\Users\\Mohit\\Desktop\\PolmStudio Tasks\\anmeDelete\\anmeDelete\\file.txt")) 

       while (!reader.EndOfStream) 
       { 
        List<string> list = null; 
        string line = reader.ReadLine(); ; 
        if (null != line) 
        { 
         list = new List<string>(); 

         string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries); 
         for (int i = 0; i < digits.Count() - 1; i++) 
         { 
          list.Add(digits[i]); 
         } 
         int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]) - 1; 
         do 
         { 
          for (int i = 0; i < list.Count(); i++) 
          { 
           if (i == blacknumber) 
           { 
            list.RemoveAt(i); 
           } 
          } 
         } while (list.Count > 1); 

        } 
        foreach (string str in list) 
        { 
         Console.WriteLine(str); 
        } 

        Console.WriteLine(""); 
       } 
      Console.ReadKey(); 
     } 
    } 
+0

你應該澄清,索引意味着數組而不是字符串(文件行)。結果只需要一個名字就能生存下來嗎? – SILENT

回答

1

感謝給予建議和解決您的建議給我的想法,我無法更改要刪除的列表項目的位置,但我可以使用%運算符更改黑名單,所以很多朋友給了我關於如何去做的感謝,但是每個人的算法都缺少一些條件。以下是實施所有必要條件的工作解決方案:

string line = reader.ReadLine(); 
        if (null != line) 
        { 
         list = new List<string>(); 

         string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries); 
         for (int i = 0; i < digits.Count() - 1; i++) 
         { 
          list.Add(digits[i]); 
         } 
         int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]); 
         int saveBlackNum = blacknumber; 
         do 
         { 
          for (int i = 0; i < list.Count(); i++) 
          { 
           if ((list.Count < (blacknumber))) 
           { 
            if(blacknumber % list.Count==0) 
            { 
             blacknumber = list.Count(); 
            } 
            else 
            { 
             blacknumber = ((blacknumber) % list.Count()); 
            }         
            break; 
           } 
           if ((list.Count >= (blacknumber))) 
           { 
            if (i == blacknumber - 1) 
            { 
             list.RemoveAt(blacknumber - 1); 
             blacknumber = saveBlackNum; 
             break; 
            } 
           } 
          } 
         } while (list.Count > 1); 

        } 
        foreach (string str in list) 
        { 
         Console.WriteLine(str); 
        } 
        Console.WriteLine(""); 

可能對未來某些人有幫助。

-1
我無法理解你想要什麼,這是你想要什麼

?如果該行中的項數比黑色數少,則停止移除項目? '如果(我== blacknumber & & list.Count> = blacknumber)'

+0

請首先理解代碼,我的代碼已經刪除了第三個索引處的列表項,但刪除後,當項數小於blackNumber時,它無法找到第三個索引並且它無限運行。 – struggling

+0

這聽起來像我正確理解你,上面應該工作,因爲每次移動物品之前,它都會確保有足夠的物品可以移除。 – Peavey2787

+0

哦,我明白了。刪除雖然list.Count> 1,這是什麼使它永遠運行。 – Peavey2787

2

我想,你要尋找的是length

既然你有這樣做使用元素n的模%一個列表,你可以做一些事情:
int listIndex = i % list.Count;

我相信它應該做你需要的。模數將返回分區的剩餘部分,因此您正在查找的索引。

1

它是一個簡單的數學。假設您的列表長度爲3。並且您想要刪除5th元素。

5 % (3 - 1) = 1。因此您必須刪除索引1中的項目,例如2nd元素。

如果您嘗試刪除的元素的索引小於列表的計數,那麼您通常會將其刪除。

List<string> list = new List<string>{"amelie", "barbon", "cat", "dog", "thomas"}; 

int blacknumber = 3; 
blacknumber--; // because indexes are 0 based 

do 
{ 
    list.RemoveAt(blacknumber < list.Count ? blacknumber : blacknumber % list.Count); 
} while (list.Count > 1); 


Console.WriteLine(list[0]); // prints barbon 

旁註:

不要使用Count(),因爲它來自LINQ調用Enumerable.Count。它不是最佳的。你可以直接使用列表的屬性。與list.Count(沒有括號)

+3

'Enumerable.Count()'對於實現ICollection 或ICollection-包含數組和列表的任何事物都是最優的。對於僅實現「IEnumerable 」或「IEnumerable」的對象來說,這只是緩慢的。換句話說,Enumerable.Count()總是最好的選擇。 – Enigmativity

+0

@ M.Kazem謝謝你的回答,你給了我想法do ..但是你的算法wioll打破了條件,例如當blackNumber = 6和list count = 3時,我們將得到6%3 = 0,所以blackNumber將會現在爲'0',而在第三個數字中刪除元素應該是'3',我給出了下面的解決方案,它將全部填滿所有條件。再次感謝您給予指導和回答。 – struggling

+0

@struggling我忘了一些東西。當你說'blacknumber = 3'你想刪除第三個項目但注意到索引是基於0的。所以你必須在索引2刪除第三項。請參閱編輯的代碼。現在它應該適用於任何情況。 –

1

我有一個更簡單的解決方案。根據你的問題,我唯一不知道的情況是,如果blackNumber是1,會發生什麼情況?答案是amelia還是thomas?

繼承人我的代碼

  var arr = new List<string>() { "amelie", "barbon", "cat", "dog", "thomas" }; 
      var goal = blackline - 2; 
      if (goal > -1) 
      { 
       if (arr.Count > goal) 
       { 
        Console.WriteLine(arr[goal]); 
       } 
       else 
       { 
        Console.WriteLine(arr[arr.Count - 1]); 
       } 
      } 
      else 
      {      
       Console.WriteLine(arr[0]); //if blackline is 1 and answer is suppose to be amelia 
       //Console.WriteLine(arr[arr.Count - 1]); //If blackline is 1 and answer is suppose to be thomas 
      } 
1

內環只需更改爲以下,你會得到你所需要的答案:

do 
{ 
    int i =0; 

    if (blacknumber >= list.Count()) i = blacknumber % list.Count(); 
    else i = blacknumber; 

    list.RemoveAt(i); 
} while (list.Count > 1); 
+0

for循環是無用的。 –

+0

我同意M.kazem Akhgary。我會更新代碼片段。 – 5Qe

相關問題