2013-05-09 3 views
0

하나의 배열 (@ array1)에있는 모든 요소를 ​​반복하면서 같은 요소가 다른 배열 (@ array2)에서 발견되면 루프를 만들고 싶습니다. 값은 첫 번째 배열에 추가되고 세 번째 배열에서 삭제 된 동일한 인덱스를 가진 세 번째 배열 (@ array3)의 값입니다. 이 방법으로 시도했지만 if 문을 사용하는 줄은 unitialized 값으로 실행되며 영원히 반복됩니다.루프에서 배열의 요소 삭제

foreach my $elem1 (@array1){ 
     my $i = 0; 
     while ($i < scalar @array2){ 
      if($array2[$i]==$elem1){ 
       push (@array1, $array3[$i]); 
       delete $array2[$i]; 
      } 
      else{ 
       $i++; 
      } 
     } 
    } 
+3

'delete' 함수는 주로 배열이 아닌 해시와 함께 사용하기위한 것입니다. 당신은'splice'를 원합니다. http://perldoc.perl.org/functions/delete.html을 참조하십시오. 일반적으로이 문제를 해결할 수있는 더 좋은 방법이 있습니다. – FMc

+1

아래의 의견은 사용자가 원하는 알고리즘을 실수로 설명했다는 것을 암시합니다. 원하는 작업을 수행하기 전후에 어레이의 모양을 보여주십시오. 원하는 것을 명확하게 보여주십시오. – pilcrow

답변

1

문제는 요소가 일치하는 경우 $ i를 증가시키지 않는 것입니다. else을 삭제하십시오.

+0

하지만 첫 번째 요소 인 array2를 삭제하면 새로운 첫 번째 요소가 있어야하므로 $ i는 요소를 올바르게 삭제하지 않으면 증분되어야합니다. – user2335015

+0

@ user2335015 : 그것은'delete'가 작동하는 방식이 아닙니다. 'splice'를 사용하십시오. – choroba

0

질문에 명시된대로 array3이 아닌 array2에서 요소를 삭제합니다. 삭제 작업은 배열 요소를 undef으로 설정한다고 생각합니다. 다음에 루프를 돌 때 $ elem에 대해 undef 인 동일한 요소를 검사합니다. 따라서 오류. 그런 다음 그는 계속해서 똑같이 반복합니다.

+0

죄송 텍스트가 잘못되었습니다. 배열 2에서 삭제하고 싶습니다. – user2335015

+0

배열 요소를'delete'하지 말고'splice'를 사용하십시오. http://stackoverflow.com/questions/174292/what-is-the-best-way-to-delete-a-value-from-an-array-in-perl을 참조하십시오. 원래 질문은 array2 요소와 동일한 색인을 사용하여 배열 3의 요소를 원하지만 요소가 array2에서 제거됨에 따라 색인이 정렬되지 않게됩니다. 그게 원하는가? – AdrianHHH

1

글쎄, 여기에 문제를 다루는 한 가지 방법이 있습니다 (내가하고 싶은 것을 이해하는 정도까지). 회원 자격에 관한 질문에 대답해야 할 때마다 해시를 사용하는 것이 좋습니다.

  • 당신이 변수 이름 (@array1, @array2 등) 번호가 한 모든 시간이, 당신이 혼란을 향하고있어 :

    use strict; 
    use warnings; 
    
    my @array1 = (11, 22, 33, 44); 
    my @array2 = (11, 2, 3, 44, 5, 44); 
    my @array3 = (-11, -2, -3, -44, -5, -444); 
    
    # Keep track of every value in @array1. 
    my %vals = map { $_ => 1 } @array1; 
    
    my @keep_indexes; 
    
    # Go through @array2, either adding the corresponding 
    # value in @array3 to @array1 or storing the array index. 
    for my $i (0 .. $#array2) { 
        if ($vals{$array2[$i]}){ 
         push @array1, $array3[$i]; 
        } 
        else { 
         push @keep_indexes, $i; 
        } 
    } 
    
    # Rebuild @array3 from the indexes that we stored. 
    # Change this to @array2 if you want to delete from that array instead. 
    @array3 = map $array3[$_], @keep_indexes; 
    
    print join(' ', @array1), "\n"; # 11 22 33 44 -11 -44 -444 
    print join(' ', @array2), "\n"; # 11 2 3 44 5 44 
    print join(' ', @array3), "\n"; # -2 -3 -5 
    

    나는 몇 가지주의를, 그래서 여기에 그 코드를 싫어한다. 변수 이름이나 더 나은 데이터 구조가 필요합니다.

  • 병렬 배열을 유지 관리해야하는 경우 언제든지 더 나은 데이터 구조가 도움이되는지 고려해야합니다.