Ruby에서 Hash 해시 구조의 기본 작동 방법 소결

6641 단어 RubyHash
해시에 대해
먼저 Hash의 기본적인 사고방식에 대해 알아보겠습니다.
저장할 대상의 개수를num로 설정하면 우리는 len의 메모리 단원으로 그것들을 저장합니다(len>=num).모든 대상 키의 키워드를 변수로 하고 함수 h(ki)로 키의 메모리 주소, 즉 키의 아래 표시를 비추어 키 대상의 요소 내용을 모두 이 주소에 저장하면 된다.이것이 바로 Hash의 기본적인 사고방식이다.
왜 함수로 그들의 주소 단원을 비추어야 합니까?
지금 네 개의 요소를 저장한다고 가정하면 13, 7, 14, 11.
분명히 우리는 수조로 저장할 수 있다.즉, a[1]=13;a[2] = 7; a[3] = 14; a[4] = 11;
물론 우리도 Hash로 저장할 수 있다.다음은 간단한 Hash 스토리지입니다.
먼저 그 함수를 확인해라.우리는 h(ki) =ki%5를 사용한다.
첫 번째 원소 h(13) = 13%5 = 3;즉 13의 아래 표시는 3이다.즉 Hash[3]=13;
두 번째 원소 h(7) = 7% 5 = 2;즉 7의 아래 표시는 2이다.즉 Hash[2]= 7;
같은 이치, Hash[4]=14;Hash[1] = 11;
지금 나는 네가 11이라는 원소가 존재하는지 아닌지를 찾아야 한다.어떻게 할 거예요?물론 수조에 대해서 말하자면, 그것은 상당히 간단하다. for순환 하나면 된다.
그러니까 네 번 찾아야 된다는 거야.
다음은 해시로 찾아볼게요.
우선, 우리가 찾으려는 원소 11을 아까 함수에 대입해서 주소 단원을 비추겠습니다.즉 h(11)=11%5=1이다.다음은 해쉬[1]?11, 이 문제는 아주 간단하다.그러니까 한 번만 찾은 거야.이것이 바로 Hash의 묘미입니다. 규칙(함수)을 제정하여 주소를 비추면 데이터도 이 규칙을 통해 메모리 주소를 찾을 수 있습니다.
루비의 Hash 구조
1. 해시 만들기: 그룹을 만드는 것처럼 해시 클래스를 통해 해시 실례를 만들 수 있습니다.

h1 = Hash.new                         # nil
h2 = Hash.new(“This is my first hash instance”) # ” This is my first hash instance”:
위의 두 가지 예는 모두 빈 Hash 실례를 만들었다.Hash 대상에는 항상 기본값이 있습니다. Hash 대상에서 지정한 인덱스 (key) 를 찾지 못하면 기본값이 되돌아오기 때문입니다.
Hash 대상을 만들면 그룹처럼 항목을 추가하거나 삭제할 수 있습니다.유일하게 다른 것은 그룹에 있는 인덱스는 정수일 뿐이고, Hash에 있는 인덱스(key)는 모든 종류(any type of object)와 유일한 데이터일 수 있다는 것이다.

h2["one"] = " "
h2["two"] = " "
h2["three"] = " "
h2["four"] = " "
Note: Hash에 값을 부여할 때 같은 키를 사용하면 뒤에 있는 값이 앞의 값을 덮어씁니다.또한 루비는 Hash를 쉽게 만들고 초기화하는 방법을 제공합니다. 키 뒤에 => 기호를 추가하고 값을 따라가면 됩니다.각 키-value 쌍은 쉼표로 구분됩니다.그리고 전체적으로 괄호로 묶는다.

h2 = {
"one" => " ",
"two" =>" ",
"three" =>" ",
"four" =>" "  
}
2. 색인을 통해 Hash 값을 저장합니다.
값을 얻으려면 다음 방법을 사용하십시오.

  puts h2[“one”]       #=>” ”
지정한 키가 존재하지 않으면 기본값을 되돌려줍니다.이 밖에 default 방법으로 기본값을 얻을 수 있습니다.default + = 방법으로 기본값을 설정할 수 있습니다

      puts h1.default
      h1.default += “This is set value method”
3. Hash 복사:
수조와 마찬가지로 우리는 하나의hash 변수를 다른hash 변수에 분배할 수 있다. 그들은 모두 같은 Hash를 인용하기 때문에 그 중의 하나가 변하면 다른 값도 따라서 변한다.

    h3 = h2
    h3[“one”] = “ ”
    puts h h2[“one”]        #=>” ”
때때로 우리는 위의 상황이 발생하는 것을 원하지 않는다. 즉, 그 중의 하나를 수정한 값도 다른 하나를 따라 수정했다. 우리는clone 방법으로make a new를 사용할 수 있다.

copy
    h4 = h2.clone
    h4[“one”] = “ ”
    puts h2[“one”]              #=>” ”(i.e.  )
4. Hash 정렬:
우리가 Hash를 정렬해야 할 때, 수조처럼 간단하게sort 방법을 사용할 수 없습니다. 수조의 데이터 형식이 모두 같기 때문에(정형), Hash의 데이터 형식은 완전히 같지 않을 수 있습니다. 예를 들어 정수 형식과 문자열 형식은 함께 정렬할 수 없습니다. 이때 우리가 처리해야 합니다. 아래와 같습니다. (하쉬의 데이터 형식이 모두 같으면 다음과 같이 처리하지 않아도 됩니다.)
      

 def sorted_hash(aHash)
       return aHash.sort{
           |a,b| a.to_s <=> b.to_s           
       }
    End
h1 = {1=>'one', 2=>'two', 3=> 'three'}
h2 = {6=>'six', 5=>'five', 4=> 'four'}
h3 = {'one'=>'A', 'two'=>'B','three'=>'C'}
h4 = h1.merge(h2)           # hash
h5 = h1.merge(h3)
def sorted_hash(aHash)
  return aHash.sort{|a,b| a.to_s <=> b.to_s }
end
p(h4)          
p(h4.sort)
p(h5)
p(sorted_hash(h5))
결과:

{5=>"five", 6=>"six", 1=>"one", 2=>"two", 3=>"three", 4=>"four"}
[[1, "one"], [2, "two"], [3, "three"], [4, "four"], [5, "five"], [6, "six"]]
{"two"=>"B", "three"=>"C", 1=>"one", 2=>"two", "one"=>"A", 3=>"three"}
[[1, "one"], [2, "two"], [3, "three"], ["one", "A"], ["three", "C"], ["two", "B"]]
 
사실 Hash의sort 방법은 하나의 Hash 대상을 [key,value]를 하나의 요소로 하는 하나의 수조로 변환한 다음에 수조의sort 방법으로 정렬하는 것이다.
 
5.Hash 클래스의 일반적인 방법:
방법
설명
size()
Hash 객체 길이 되돌리기
length()
Hash 객체 길이 되돌리기
include?(key)
지정한 Hash 객체에 지정된 키가 포함되어 있는지 판단합니다.
has_key?(key)
지정한 Hash 객체에 지정된 키가 포함되어 있는지 판단합니다.
delete(key)
Hash 객체에서 지정한 키의 대응 요소 삭제
keys()
Hash 객체의 모든 키로 구성된 배열 반환
values()
Hash 객체의 모든 value로 구성된 배열 반환
e.g.
       

 student = {
         "name" => "Steve",
         "age" => 22,
         "Gender" => "male"
        }   
   p student.keys                           #=> ["name", "Gender", "age"]
   p student.values                        #=> ["Steve", "male", 22]
   puts student.include?("age")                #=> true
   puts student.size                          #=> 3
   student.delete("Gender")
   puts student.has_key?("Gender")              #=>false
   puts student.size                          #=>2
 
깊이 파고들다
1. Hash를 수조로 처리:
Hash의 keys and values 방법의 반환 값은 모두 하나의 수조이기 때문에 우리는 수조의 방법을 사용하여 그것들을 조작할 수 있다.

h1 = {1=>'one', 2=>'two', 3=> 'three',4=> 'four'}
h2 = {1=>'one', 3=>'two', 4=> 'four',5=> 'five'}
 
p( h1.keys & h2.keys )
p( h1.values & h2.values )
p( h1.keys+h2.keys )
p( h1.values-h2.values )
p( (h1.keys << h2.keys) )
p( (h1.keys << h2.keys).flatten)
결과:

[1, 3, 4]
["one", "two", "four"]
[1, 2, 3, 4, 5, 1, 3, 4]
["three"]
[1, 2, 3, 4, [5, 1, 3, 4]]
[1, 2, 3, 4, 5, 1, 3, 4]
 
2. 추가와 연속의 차이점:
+: 그룹에 요소를 추가하고 새 그룹을 만듭니다
<>: 한 데이터에 요소를 추가하고 원본 그룹을 직접 조작합니다. 한 그룹에 추가된 새 요소도 하나의 그룹일 때 이 새 요소는 그룹의 마지막 요소입니다.

  a=[1,2,3]
  b=[4,5,6]
 
  p(a+b)
  p(a<<b)
결과:

[1, 2, 3, 4, 5, 6]
[1, 2, 3, [4, 5, 6]]     #[1, 2, 3, [4, 5, 6]].flatten =>[1, 2, 3, 4, 5, 6]

좋은 웹페이지 즐겨찾기