Forum: Ders Arası RSS
Dinamik Dizi Eleman Silme
Sayfa:  1  2  sonraki 
Avatar
huseyin #1
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dinamik Dizi Eleman Silme
Merhaba arkadaşlar ben kendi işim için aşağıdaki gibi ufak bir fonksiyon yazım dedim ama niyeyse beceremedim
yardım eder misiniz?

import std.stdio;
import std.array;
 
string[] elemansil(string[] dizi,string eleman)
{
    string[] dizi2;
    int sayac = dizi.length;
    for (int i=0;i>=sayac;++i)
    {
        if(dizi[i]==eleman)
        {
            i++;
        }
        else
        {
            dizi2[i]~=dizi[i];
        }
    }
    return dizi2;
}
 
 
 
 
void main()
{
    string[] abc;
    abc~="abc";
    abc~="ben";
    abc~= "sen";
    auto aaa=elemansil(abc,"ben");
    writeln(aaa);
}
Huseyin
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu haliyle çalışıyor;
import std.stdio;
import std.array;
 
string[] elemansil(string[] dizi,string eleman)
{
    string[] dizi2;
    int sayac = dizi.length;
    for (int i=0;i<sayac;++i)
    {
        if(dizi[i] != eleman)
        {
            dizi2~=dizi[i];
        }
    }
    return dizi2;
}
 
void main()
{
    string[] abc;
    abc~="abc";
    abc~="ben";
    abc~= "sen";
    auto aaa=elemansil(abc,"ben");
    writeln(aaa);
}
i>= sayac koşulu hatalı gibi geldi.i her zaman sayac'tan küçük olmalı gibi geliyor.
Avatar
huseyin #3
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ah evet onu görmemişim klavyede hata çok oluyor 10 parmağım iyi değil ve dikkatsiz yazıyorum teşekkürler
Huseyin
Avatar
huseyin #4
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
gitHub a eklendi
Huseyin
Bu mesaj huseyin tarafından değiştirildi; zaman: 2012-07-13, 06:27.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu bana std.algorithm.findSplit'i hatırlattı:

import std.algorithm;
 
string[] elemansil(string[] dizi,string eleman)
{
    auto sonuçParçalar = findSplit(dizi, [ eleman ]);
    return sonuçParçalar[0] ~ sonuçParçalar[2];
}

Arama sonucunu üç parça halinde döndürür:

[0]: Bulunandan önceki bölüm
[1]: Bulunan
[2]: Bulunandan sonraki bölüm


Hüseyin, bunu kullanmasan bile seninkinde de döngünün sonuna kadar ilerlemene gerek yok. Aradığının indeksini belirledikten sonra (ve eğer indeks+1 yasalsa) şu da siler:

    dizi = dizi[0 .. indeks] ~ dizi[indeks + 1 .. $];

Ali
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
Bu şekilde eleman silme hızlı olmayacaktır. Sıralı arama yerine en azından ikili arama algoritmasını (her seferinde eleman sayısını yarılayarak arayan bir kod) yapmakta fayda var. Ayrıca dizinin elemanını doğrudan std.algorithm.remove ile döndürmek ve hafızada ikinci bir dizi oluşturmadan bunu yapmak çok daha iyi olacaktır. Örneğin:
import std.algorithm, std.stdio;
 
string[] elemansil(string[] dizi,string eleman)
{
    for (int i=0;i<sayac;++i)
    {
        if(dizi[i] == eleman)
        {
            return dizi.remove(i);
        }
    }
    return dizi;
}
Ayrıca şurada bağlı liste ile karşılaştırma hızı çalışması ve testi yapılmıştır. Eleman ekleme ve çıkarma gibi değişik şeyler yaptığımızı hatırlıyorum.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-07-13, 08:04.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ah! Tabii benim yöntem yalnızca ilk bulduğunu siliyor.

Ali
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aaa evet, benim kod da ilk bulduğunu silip olduğu gibi gönderecektir...:)

Basit mantık iyidir! Karşılaştırma olması için her iki mantığı güzel bir cümle ile örneklersek:
import std.algorithm, std.stdio;
 
auto tekiniSil(string[] dizi, string eleman)
{
    string[] dizi2; // <---Bu kullanılmadığında tekini siler...
    for(int i = 0; i < dizi.length; i++) {
        if(dizi[i] == eleman) return dizi.remove(i);
    }
    return dizi;
}
 
auto hepsiniSil(string[] dizi, string eleman)
{
    string[] dizi2;
    for(int i = 0; i < dizi.length; i++) {
        if(dizi[i] != eleman) dizi2 ~= dizi[i];
    }
    return dizi2;
}
 
void main()
{
    auto cümle = [ "Ali,", "o", "topu", "at", "yoksa",
                   "bisiklete", "topu", "koyamazsın." ];
    
    foreach(s; cümle) s.write(" ");
    writeln;
    foreach(s; tekiniSil(cümle, "topu")) s.write(" ");
    writeln;
    foreach(s; hepsiniSil(cümle, "topu")) s.write(" ");
    writeln;
}/* Çıktısı:
Ali, o topu at yoksa bisiklete topu koyamazsın. 
Ali, o at yoksa bisiklete topu koyamazsın. 
Ali, o at yoksa bisiklete koyamazsın. koyamazsın.
*/
Bu tekrarların -------------------------------^----------------------^ neden olduğunu bilmiyorum...:(
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-07-13, 09:22.
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım std.algorithm.remove'da bir bug var!

Kullandığım derleyici sürümü: DMD 2.059

Diziyi, işleve ref takısı ile uygulamadığımız halde cümle dizisine yan etkisi varmış! Bu remove() işlevini kullanırken dikkatli olmakta fayda var çünkü dilim ile döndürdüğümüzde hiç bir sorun olmuyor:
    :    :    :
 
auto tekiniSil(string[] dizi, string eleman)
{
    string[] dizi2; // <---Bu kullanılmadığında tekini siler...
    for(int i = 0; i < dizi.length; i++) {
        if(dizi[i] == eleman) return dizi[0..i] ~ dizi[i+1..$];
    }
    return dizi;
}
 
    :    :    :
 
}/* Çıktısı:
Ali, o topu at yoksa bisiklete topu koyamazsın. 
Ali, o at yoksa bisiklete topu koyamazsın. 
Ali, o at yoksa bisiklete koyamazsın.
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Uyarı için teşekkürler. ama aslında remove()'da hata yok çünkü davranışını öyle belgelemişler: Uyan eleman buldukça son taraftaki elemanları onun üstüne kaydırıyor. Yani asıl aralığın uzunluğunda değişiklik yapmıyor.

Pek kullanışlı değil... :/

Ali
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
Salih Dinçer:
Diziyi, işleve ref takısı ile uygulamadığımız halde cümle dizisine yan etkisi varmış!

Dilimlerle ilgili olarak en çok dikkat edilmesi gereken konu o zaten. Dışardaki ve içerdeki dilimler aynı elemanlara eriştirmeye devam ediyorlar.

Ali
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bilgilendirme için (gerçekten) çok teşekkürler...

Bu ders arasında yeni yeni şeyler öğrendik ya şaşırıyorum; öğrenmenin sonu yok herhalde...:)

Bu arada örnek cümlelerin üçünün de farklı anlamı var ve bilinçli seçilmiş kelimeler:

1. cümle: "Ali, o topu at yoksa bisiklete topu koyamazsın."
Eğer Ali, topu elinde tutmaya (atmak fiili) devam ederse bisikletten düşmemesi için bir yere koymalı.

2. cümle: "Ali, o at yoksa bisiklete topu koyamazsın."
Eğer Ali'nin bir atı (hayvan ismi) yoksa çok kötü çünkü at kendiliğinden gider ama bisiklet gitmez...:)

3. cümle: "Ali, o at yoksa bisiklete koyamazsın."
Ali, atın yoksa çok kötü çünkü ismini vermediğim şeyi bisiklete koyamazsın ama at için böyle bir sorun yok...hahay

(İşte bu son cümle çok zorlama oldu ama Türkçe dili çok kıvrak işte, tıpkı D gibi!)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
cümlelerin üçünün de farklı anlamı var

Güzelmiş. :)

Ali
Avatar
huseyin #14
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam ben c#  da bu işlemi direk gerçekleştirebiliyordum aynı eşleme tablolarındaki gibi nitelik olarak bulunuyordu ama D de remove işlemini dizilerde kullanımı konusunda bilgim yok bende kafadan birşey uydurdum :)
tahminim yanlışlar doğuracaktır
Huseyin
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Gerçi Zafer bizi aydınlatacaktır ama sorabilir miyim; bildiğimiz basit bir dizide (sanırım vector list diyorlar) doğrudan içeriğe göre silme işlemi C#'da nasıl oluyor? Hatırladığım kadarıyla ArrayList de oluyordu ve bu çağrışımsal (associative) dizilere benzer bir şey...

Bakınız şimdi şöyle bir kod buldum:
            ArrayList myArr = new ArrayList();
 
            myArr.Add("one");
            myArr.Add("two");
            myArr.Add("three");
 
            Console.WriteLine("Before deletion:");
            ShowArray(myArr);
 
            myArr.Remove("three");
            ShowArray(myArr);
Aslında düşünüyorum da kendimiz ArrayList isminde bir sınıf oluşturup üyesini de int[string] yapıp bu yapının .remove özelliğini keys ismini doğrudan vererek kullanabiliriz. Tabi sıralamalar hash algoritmasından dolayı değişecektir ama sıralı listeletmek istersek kendimiz .sort diye bir özellik yazabilmemiz de mümkün.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-07-14, 01:58.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 04:27:11 (UTC -08:00)