C# Dizilerde Arama Hkn
-
Hayırlı cumalar.
diziler içinde arama yapmak istiyorum dizinin içinde yaklaşık 50 bin rakama var .
dizi içindeki rakam örnek = 5-20-1-2-9-16-22-45-23-8-33-
1-2-9-75 bu şekilde olduğunu düşünelim programda 3 tane textbox var .
1'ci textbox = degeri 1
2'ci textbox = degeri 2
3'ci textbox = degeri 9
Program girilen değerleri 1-2-9 dizi içinde arama yapacak , bu sıralamada aynı var ise bu numaradan sonrakini bana göstermesini istiyorum yani elde etmek istediğim sonuc 16 ve 75 rakamıdır.
umarın anlatabilmişimdir. bu konuda yardım edebilirmisiniz.
-
int Value1 = 1, Value2 = 2, Value3 = 9; List<int> ListToSearch = new List<int>() {1, 2, 3}; List<int> indexListFor1 = new List<int>(), indexListFor2 = new List<int>(), indexListFor3 = new List<int>(), resultIndexList = new List<int>(); for (int i = 0; i < ListToSearch.Count; i++) { if (ListToSearch[i] == Value1) indexListFor1.Add(i); else if (ListToSearch[i] == Value2) indexListFor2.Add(i); else if (ListToSearch[i] == Value3) indexListFor3.Add(i); } foreach (var index in indexListFor1) { if (indexListFor2.Any(x => x == index + 1) && indexListFor3.Any(x => x == index + 2)) resultIndexList.Add(index + 3); }
Muhtemelen en efektif yol değildir ama O(n) complexityde aradığın sayıların indexini şu şekilde bulabilirsin
-
ha bir de aradığın 3'lünün dizinin en sonunda belirmesi durumunda, resultIndexList dizinin boyutundan büyük bir indexi içermiş oluyor. o bug'u düzeltmek gerek :D
-
buyur hocam;
List<int> _numberList = new List<int>(); _numberList.AddRange(new int[] { 5, 20, 1, 2, 9, 16, 22, 45, 23, 8, 33, 1, 2, 9, 75 }); int textBox1 = 1; int textBox2 = 2; int textBox3 = 9; List<int> bulunanList = new List<int>(); //Bilale anlatır gibi anlatıyorum! for (int i = 0; i < _numberList.Count; i++) //list kadar dön { if (_numberList[i] == textBox1) //diziden gelen değer textbox1 (1) eşitse 1 rakamını bulmuşuzdur demektir. { if (_numberList[i + 1] == textBox2) // 1 rakamından sonraki gelen rakama bakalım textBox2 (2) sayısı mı ? +1 dememizin sebebi bir sonraki sayı anlamında. { if (_numberList[i + 2] == textBox3) //2 rakamından sonraki gelen rakama bakalım textBox3 (9) sayısı mı ? +2 dememizin sebebi 2 sonraki sayı anlamında { //şakkadanak bulduk bir sonraki rakamını istiyorduk (16,75 etc.) alalım hemen int Deger = _numberList[i + 3]; //+3 dememizin sebebi 3 sonraki sayıyı getir anlamında bulunanList.Add(Deger); } } } }
-
Tawe bunu yazdı
ha bir de aradığın 3'lünün dizinin en sonunda belirmesi durumunda, resultIndexList dizinin boyutundan büyük bir indexi içermiş oluyor. o bug'u düzeltmek gerek :D
hocam mümkün ise müsait bir anda yazabilirmisin.
http://s3.dosya.tc/server17/zb8y4q/sayilar.txt.html numaralar burada
List<int> lst = new List<int>(); int[] integerArray = new int[500000]; private void Form1_Load(object sender, EventArgs e) { int contor = 0; string[] stringArray = System.IO.File.ReadAllLines(@"C:\data\sayılar.txt"); foreach (string example in stringArray) { lst.Add(Convert.ToInt32(example.Trim())); integerArray[contor] = Convert.ToInt32(example.Trim()); ++contor; } }
-
saybirs bunu yazdı
buyur hocam;
List _numberList = new List(); _numberList.AddRange(new int[] { 5, 20, 1, 2, 9, 16, 22, 45, 23, 8, 33, 1, 2, 9, 75 }); int textBox1 = 1; int textBox2 = 2; int textBox3 = 9; List bulunanList = new List(); //Bilale anlatır gibi anlatıyorum! for (int i = 0; i < _numberList.Count; i++) //list kadar dön { if (_numberList[i] == textBox1) //diziden gelen değer textbox1 (1) eşitse 1 rakamını bulmuşuzdur demektir. { if (_numberList[i + 1] == textBox2) // 1 rakamından sonraki gelen rakama bakalım textBox2 (2) sayısı mı ? +1 dememizin sebebi bir sonraki sayı anlamında. { if (_numberList[i + 2] == textBox3) //2 rakamından sonraki gelen rakama bakalım textBox3 (9) sayısı mı ? +2 dememizin sebebi 2 sonraki sayı anlamında { //şakkadanak bulduk bir sonraki rakamını istiyorduk (16,75 etc.) alalım hemen int Deger = _numberList[i + 3]; //+3 dememizin sebebi 3 sonraki sayıyı getir anlamında bulunanList.Add(Deger); } } } }
teşekür ederim hocam çok sağol tam istediğim gibi.
-
saybirs bunu yazdı
buyur hocam;
List _numberList = new List(); _numberList.AddRange(new int[] { 5, 20, 1, 2, 9, 16, 22, 45, 23, 8, 33, 1, 2, 9, 75 }); int textBox1 = 1; int textBox2 = 2; int textBox3 = 9; List bulunanList = new List(); //Bilale anlatır gibi anlatıyorum! for (int i = 0; i < _numberList.Count; i++) //list kadar dön { if (_numberList[i] == textBox1) //diziden gelen değer textbox1 (1) eşitse 1 rakamını bulmuşuzdur demektir. { if (_numberList[i + 1] == textBox2) // 1 rakamından sonraki gelen rakama bakalım textBox2 (2) sayısı mı ? +1 dememizin sebebi bir sonraki sayı anlamında. { if (_numberList[i + 2] == textBox3) //2 rakamından sonraki gelen rakama bakalım textBox3 (9) sayısı mı ? +2 dememizin sebebi 2 sonraki sayı anlamında { //şakkadanak bulduk bir sonraki rakamını istiyorduk (16,75 etc.) alalım hemen int Deger = _numberList[i + 3]; //+3 dememizin sebebi 3 sonraki sayıyı getir anlamında bulunanList.Add(Deger); } } } }
1.deger uyarsa, +1, +2 bakmak yerine, bir sonrakinde 2.iyi, o da olursa 3.yu arasan daha performansli olur. boylece dongu sadece 1 kere donmus olur.
-
herlocksholmes bunu yazdısaybirs bunu yazdı
buyur hocam;
List _numberList = new List(); _numberList.AddRange(new int[] { 5, 20, 1, 2, 9, 16, 22, 45, 23, 8, 33, 1, 2, 9, 75 }); int textBox1 = 1; int textBox2 = 2; int textBox3 = 9; List bulunanList = new List(); //Bilale anlatır gibi anlatıyorum! for (int i = 0; i < _numberList.Count; i++) //list kadar dön { if (_numberList[i] == textBox1) //diziden gelen değer textbox1 (1) eşitse 1 rakamını bulmuşuzdur demektir. { if (_numberList[i + 1] == textBox2) // 1 rakamından sonraki gelen rakama bakalım textBox2 (2) sayısı mı ? +1 dememizin sebebi bir sonraki sayı anlamında. { if (_numberList[i + 2] == textBox3) //2 rakamından sonraki gelen rakama bakalım textBox3 (9) sayısı mı ? +2 dememizin sebebi 2 sonraki sayı anlamında { //şakkadanak bulduk bir sonraki rakamını istiyorduk (16,75 etc.) alalım hemen int Deger = _numberList[i + 3]; //+3 dememizin sebebi 3 sonraki sayıyı getir anlamında bulunanList.Add(Deger); } } } }
1.deger uyarsa, +1, +2 bakmak yerine, bir sonrakinde 2.iyi, o da olursa 3.yu arasan daha performansli olur. boylece dongu sadece 1 kere donmus olur.
:) teşekkürler, yeni programlamaya başlayacak junior arkadaşlar için önerin ışık kaynağı olabilir. Kodu yazarken bir sonraki değerler için fazladan döneceğini farkettim canlıya çıkacak kod bloğu olmadığından uzatmaya gerek duymadım, sonuçta arkadaş projesine ekleyip geçecek. Performans olarak değerlendirirsek, List yerine HashSet, tek thread yerine multithread etc. diyerek çoğaltabiliriz :)