2012-04-09 7 views
0

또 다른 질문이 있습니다. 나는 해쉬 함수와 모든 재즈를 만들기 위해 임무를 수행하고 있었고, 나는 작은 문제를 우연히 발견했다. 내 머리가 작동에다른 메소드에서 변수에 액세스하기 (Java)

Line 35:21, where it reads arrpos += prearrpo & ______,

은 ... 무엇을하려고 메신저하면 HashTable() 방법에서 접근 arr.length입니다. 나는 크기 arr.length의 객체를 만들 필요가있는 제안을 읽었습니다. 그러나 내 마음에,이 지나치게 복잡하게 보인다 -

다른 방법은 내가 HashTable 메서드에서 변수를 액세스 할 수 있지만 삽입 방법 안에 있습니까?

또 다른 중요하지 않은 질문은 문자 (char c) 클래스의 if() 문장의 거대한 블록과 관련됩니다. 나는 이것을하기위한 더 짧은 방법이 틀림 없다고 확신한다 ... 나는 초기에 ascii 값을 사용했을 것이다. 하지만 사양은

감사

import java.io.*; 

public class HashTable { 

    public HashTable() { 
     //Create an array of size 101 
     String arr[] = new String[101]; 
     //System.out.println("Size1: "); 
    } 

    public HashTable(int tsize) { 
     int size = 2 * tsize; 
     //System.out.println("Size: " + size); 
     boolean isPrime = checkPrime(size); 
     //System.out.println("IsPrime: " + isPrime); 
     while (isPrime == false) { 
      //System.out.println("Size: " + size); 
      size++; 
      isPrime = checkPrime(size); 
     } 
     //System.out.println("Size: " + size); 
     String arr[] = new String[size]; 
    } 

    public boolean insert(String line) { 

     String str = line; 
     char[] ch = str.toCharArray(); 
     int slen = str.length(); 
     int arrpos = 0; 
     int hash = slen; 
     for (int i = 0; i < slen; i++) { 
      double prearrpo = letter(ch[i]) * Math.pow(32, (hash - 1)); 
      arrpos += prearrpo % arr.length(); 
      hash--; 

     } 
     System.out.println(arrpos); 
     System.out.println("array size:"); 
     System.out.println(); 
     return false; 

    } 

    private int letter(char c) { 
     char ch = c; 
     if (ch == 'A' || ch == 'a') { 
      return 1; 
     } 
     if (ch == 'B' || ch == 'b') { 
      return 2; 
     } 
     if (ch == 'C' || ch == 'c') { 
      return 3; 
     } 
     if (ch == 'D' || ch == 'd') { 
      return 4; 
     } 
     if (ch == 'E' || ch == 'e') { 
      return 5; 
     } 
     if (ch == 'F' || ch == 'f') { 
      return 6; 
     } 
     if (ch == 'G' || ch == 'g') { 
      return 7; 
     } 
     if (ch == 'H' || ch == 'h') { 
      return 8; 
     } 
     if (ch == 'I' || ch == 'i') { 
      return 9; 
     } 
     if (ch == 'J' || ch == 'j') { 
      return 10; 
     } 
     if (ch == 'K' || ch == 'k') { 
      return 11; 
     } 
     if (ch == 'L' || ch == 'l') { 
      return 12; 
     } 
     if (ch == 'M' || ch == 'm') { 
      return 13; 
     } 
     if (ch == 'N' || ch == 'n') { 
      return 14; 
     } 
     if (ch == 'O' || ch == 'o') { 
      return 15; 
     } 
     if (ch == 'P' || ch == 'p') { 
      return 16; 
     } 
     if (ch == 'Q' || ch == 'q') { 
      return 17; 
     } 
     if (ch == 'R' || ch == 'r') { 
      return 18; 
     } 
     if (ch == 'S' || ch == 's') { 
      return 19; 
     } 
     if (ch == 'T' || ch == 't') { 
      return 20; 
     } 
     if (ch == 'U' || ch == 'u') { 
      return 21; 
     } 
     if (ch == 'V' || ch == 'v') { 
      return 22; 
     } 
     if (ch == 'W' || ch == 'w') { 
      return 23; 
     } 
     if (ch == 'X' || ch == 'x') { 
      return 24; 
     } 
     if (ch == 'Y' || ch == 'y') { 
      return 25; 
     } 
     if (ch == 'Z' || ch == 'z') { 
      return 26; 
     } 
     return 0; 
    } 

    public boolean lookUp(String string) { 
     // 
     return false; 
    } 

    public String getNum() { 
     // 
     return null; 
    } 

    public int length() { 

     return 0; 
    } 

    private static boolean checkPrime(int size) { 

     if (size % 2 == 0) { 
      return false; 
     } 
     double c = Math.sqrt(size); 
     for (int i = 3; i < c; i += 2) { 
      if (size % i == 0) { 
       return false; 
      } 
     } 



     return true; 
    } 
} 
+0

:로) 생성자를 호출 http://stackoverflow.com/questions/4262567/convert-letter-to-digits – assylias

+0

@assylisa 감사합니다, 그 시간 elps 많이! – J3210

+1

어? 그보다 더 간단한 방법이 있습니다. 'Return Character.isLetter (ch)? (Character.toUpperCase (ch) - 'A'+ 1) : 0;'한 줄에 입력하십시오. –

답변

1

public HashTable() 생성자가 letters-/낮은 대문자의 값 1-26 사용에 대한 아주 특별한했다. arr[]은 실제로 클래스의 개인 회원이어야하며 모든 생성자에서 초기화해야하며 초기화하지 않고 액세스하지 못하도록해야합니다.

public class HashTable { 
String arr[] = null; 

그리고 당신의 생성자에서 초기화 (주 HashTable() 같은 자바 세계 방법에 : 그것은 당신의 구현이 배열 백업 것으로 보인다 때문에

public class HashTable { 

    private String[] arr; 

    public HashTable() 
    { 
     //Create an array of size 101 
     arr[] = new String[101]; 
     System.out.println("Size1: "); 
    } 
etc... 
0

, 당신은 멤버 변수로 배열을 선언 할 필요가 당신의`letter` 방법에 관한

arr = new String[whatever_size]; 
관련 문제