2009-06-30 2 views
1

이 필드를 처음 접했습니다. 친절하게 나에게 쉽게 가라. 두 배열이 있습니다 :Perl에서 배열의 다른 요소를 어떻게 비교할 수 있습니까?

@array1 = ("ABC321", "CDB672", "PLE89",....); 

@array2 = ("PLE89", "ABC678", "LMD789",...); 

이 두 가지 배열의 요소를 비교하고 싶습니다. 그러나 편지와 문자를 일치시키고 싶습니다. 예를 들어 배열을 비교할 경우 $array[2] 요소 (PLE)는 $array2[0] (PLE)과 일치해야하며 $array1[0] (ABC)은 $array[1] (ABC)과 일치해야합니다. 하나씩 할 수 있지만 동시에 배열의 모든 요소를 ​​비교할 수는 없습니다 (즉 배열을 반복하는 것).

my ($value1)= ($array[2]=~ /([A-Z]+)[0-9]+/); 
    print "Value1: $value1 \n"; 
    my ($value2)= ($array[0]=~ /([A-Z]+)[0-9]+/); 
    print "Value2 : $value2 \n"; 
    if ($value1 eq $value2){ 
      print " length \n"; 
    } 

어떻게해야합니까? 두 어레이에 동시에 루프를 설정하는 방법에 대한 제안 사항은 무엇입니까?

+0

W 모자는 정확히'print '길이 \ n ";'문장에서 끝내시겠습니까? 단어 길이를 인쇄하거나 길이 함수를 사용 하시겠습니까? – Telemachus

+0

@Telemachus : 아이디어는 길이를 인쇄하는 것이 아닙니다. Thats는 조건이 만족되면 (두 배열의 다른 요소의 문자가 일치하는 경우) 인쇄하기 위해 작성한 단어입니다. 배열의 모든 요소를 ​​비교하고 문자 (예 : ABC, PBL)가 일치하는 요소 만 저장/출력하고 싶습니다. – birdy

+0

@ Birdy : 나는 당신에게 많은 말을하지 않기 때문에 당신이 경기를 할 때마다 같은 메시지를 원하지 않는다고 생각하지 않습니다. 즉, 성냥을 얻으면 "길이", 다음 (다음 성냥) "길이", (다음 성냥) "길이"등을 반복해서 볼 수 있지만 일치하는 항목은 알 수 없습니다. 모든 솔루션을 살펴보면 공통점이있는 한 가지는 메시지가 사용자에게 무엇을 일치시키는 지 알려주려고한다는 것입니다. – Telemachus

답변

4

당신은 조회 장치로 해시를 사용할 수 있습니다.. 쌍대 비교의 차 번호와 를 이동하고 O(m+n) 솔루션을 얻을 n은 array2의 길이입니다.)

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array1 = qw(ABC321 CDB672 PLE89); 
my @array2 = qw(PLE89 ABC678 LMD789); 

my %seen; 

for my $item (@array1) { 
    die "not a valid item: $item" 
     unless my ($key) = $item =~ /([A-Z]+)/; 

    #we are using an array to hold the items in case 
    #the same key shows up more than once in an array 
    #this code can be simpler if you can guarantee 
    #that the keys are unique 
    push @{$seen{$key}}, $item; 
} 

for my $item (@array2) { 
    die "not a valid item: $item" 
     unless my ($key) = $item =~ /([A-Z]+)/; 
    if (exists $seen{$key}) { 
     print "$item is in array1, it matches @{$seen{$key}}\n"; 
    } else { 
     print "$item is not in array1\n"; 
    } 
} 
2

언어에 알맞지 않은 제안은 두 배열을 먼저 정렬해야합니다 (O (n lg (n))을 취해야하며 선형 시간에 두 개의 반복기와 비교하십시오.) 성능이 문제가되지 않는다면 간단하게 유지하십시오. m가하는 array1의 길이입니다 (당신은 또한 결국 자리 제거 할 수 정렬하는 동안

관련 문제