Thread overview
std.remove ile bir diziden toplu olarak eleman silme
Nov 18, 2019
kerdemdemir
Nov 18, 2019
kerdemdemir
Nov 22, 2019
Salih Dinçer
Nov 23, 2019
kerdemdemir
November 18, 2019

Merhaba,

Dertliyim dostlar 2 saattir dizimden toplu bir şekilde eleman çıkarmaya çalışıyorum:

import std.stdio;
import std.math;
import std.range;
import std.algorithm;
import std.typecons;

int[][4] tempMap;


void main()
{
   int[] temp  = [ 1, 2, 3 , 4 ,5 ];
	tempMap[0] =  temp.dup;
   tempMap[1] = temp.dup;
   tempMap[2] = temp.dup;
   tempMap[3] = temp.dup;

   int[] removeList;
   for ( int i = 0; i < tempMap[0].length; i++ )
   {
       if ( i%2 == 0 )
           removeList ~=i;
   }
   writeln(removeList);
   tempMap[1].remove(0,2,4);
   tempMap[2].remove(removeList);
   tempMap[3].remove(tuple(0,1),tuple(2,3),tuple(4,5) );

   //tempMap[1].length -= 2;
   writeln(tempMap);
}


writeln(removeList); [0, 2, 4] yazdırıyor.

tempMap[1].remove(0,2,4); --> Tam istediğimi yapıyor. [2, 4, 3, 4, 5]
tempMap[2].remove(removeList); ---> Bambaşka bir sonuç veriyor. [3, 4, 5, 4, 5]
tempMap[3].remove(tuple(0,1),tuple(2,3),tuple(4,5) ); --> Buda oluyor

Ben 'removeList' 'i nasıl "0,2,4" şeklinde bir sequence 'a çevirebilirim a dostlar.

Erdem .

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 19, 2019

Ali Abi haklısın.

Ben liste şeklinde çıkarmayı yapamadıkdan sonra teker teker çıkarayım dedim ama "retro" adımını atladım. Indekslerin kaydığını anladım ama "retro" ile geriden gelmek aklıma gelmemişdi.

En son çok kötü bir çözüm buldum kendime bütün listeyi çıkarmam gerekenler hariç kopyalıyorum. Ama senin yöntem daha güzel ona dönüştürürüm .

Erdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 18, 2019

Dlang forumlarında açtığın konuyu gördüm. @deprecated konusunda haklılar: remove(0, 2) dediğinde 0'ıncıyı ve 2'nciyi mi çıkartmak istiyorsun yoksa 0'dan 2'ye kadar mı çıkartmak istiyorsun. Açık olmadığından @deprecated. Güzel.

Onun dışında iki nokta önemli:

  • remove() asıl aralıkta değişiklik yapmadığından, döndürdüğü aralığın tekrar asıl aralığa atanması gerekiyor.

  • İndeksler eleman çıkarttıkça kaydığından bu işi sondan başa doğru yapmak gerek.

Şu satır çalıştı ve sanırım sonuç istediğin gibi:

   removeList.retro.each!(i => tempMap[2] = tempMap[2].remove(i));

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 22, 2019

std.algorithm.remove() konusu ilgimi çekti ve tabii ki Ali hocamın çözümü harika. Lambda'lı olanaklar hoşuma gidiyor. Örneğin senin istediğin olmasa da döngü içindeki olay aslında tek satırla süzülebilir:

import std.algorithm;
import std.stdio;
static immutable temp  = [ 0, 1, 2, 3, 4, 5 ];

void main()
{
   int[] map = temp[].dup;
   int[] removeList;

   for ( int i = 0; i < map.length; i++ )
   {
       if (i%2 == 0) removeList ~= i;
   }
   writeln(removeList);
   writeln(remove!(a => a % 2 )(map));
}

Ve's-selam...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 23, 2019

Salih Hocam bence gayet güzel bir çözüm.

Benim elimde indeksler olduğu için ve gerçekteki durumum a%2 gibi olmadığı için
uymuyor ama duruma uygun olsaydı bunuda kullanabilirdim.

Erdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]