2014-03-06 3 views
0

기본 파일 시스템을 만들려고합니다. Collections 라이브러리를 사용할 수 없습니다. 이 파일 시스템은 FilesDirectories의 두 가지 유형의 데이터를 저장합니다. FileDirectory 유형은 모두 추상 유형 Entry의 하위 클래스입니다.컬렉션 라이브러리가없는 HashTable

내 디자인은 지금까지

내 해시 함수는 Entry의 이름을 가지고 정수로 이름의 각 문자로 변환 한 값을 요약하는 것입니다. 그것은 내가 문제가 해시 테이블을 설계하고 데 무엇

protected static int hashFunction(String entryName) { 
     char[] a = entryName.toCharArray(); 
     int sum = 0; 
     // convert String to integer Value 
     for (char b : a) { 
      sum += (int) b; 
     } 
     int hashValue = sum % hashTableKey; 
     return hashValue; 
    } 

배치되는 경우 배열의 크기에 다음 모드 값을 확인합니다. 현재 해시 함수가 값을 계산하면 hashVaue에 상대적인 배열에 Entry ( entryName)의 이름을 저장합니다. 나는 실제 객체를 같은 크기의 다른 배열에 저장하여 이러한 객체를 보관합니다. 이러한 객체의 저장소는 객체의 이름을 보유하는 배열의 각각의 이름과 동일한 색인을가집니다.

* 객체가 될 수있는 파일이나 디렉토리 중 하나

| "obj1" | None | "obj3" | None | None | None | "obj2" | None | 

| obj1 | None | obj3 | None | None | None | obj2 | None | 

이 해시 테이블을 사용하여 파일 시스템을 구현할 수있는 좋은 방법입니다 확실하지. 내가 왜 해시 테이블을 선택했는지는 O (1) 조회로 인한 것입니다. 그러나 그것은 큰 공간 요구 사항이 있습니다. 특히 내가 구현 한 방법. 파일 시스템을 구현하는 더 좋은 방법이 있다면 알려주십시오! 나는 아이디어에 열중하고있다 !!

+1

해시 코드를 얻으려면'entryName.hashCode()'를 호출하면 어떨까요? 그리고 이것은 단지 학업 수행 (표준 컬렉션을 사용할 수 없다면 나는 가정합니다) 인 경우 O (1) 조회가 실제로 요구 사항입니까? –

+0

@JonSkeet 이것은 숙제와 같지만 인터뷰 질문을 공부하고 연습함으로써 실제로 자바를 배우고 있습니다. 'hashCode()'를 잊어 버렸습니다. 그것이 어떻게 작동하는지 잘 모르지만 나는 그것을 찾을 수있다. 내 생각 엔 정확한 위치에 배치하기 위해 size와 함께 hashCode()를 사용하여 결과를 mod로 변환하는 것일까? 인터뷰에서 잘 보였기 때문에 나는 O (1)을하고 싶었다. haha ​​ – Liondancer

답변

1

다른 배열을 가져야한다고 생각하지 않습니다. 요소를 선택하면 엔티티가 이름을 알 수 있으므로 실제 배열을 쉽게 저장할 수 있으므로 실제 배열을 첫 번째 배열에 저장할 수도 있습니다.

내가 뭔가를 오해하지 않는 한 내가 디자인 결함으로 보는 것은 실제로 많은 파일을 많은 키만큼 저장할 수 있기 때문에 두 파일에 동일한 해시 코드가있을 때 실제로 오류가 발생하기 쉽다는 것입니다 해시 테이블에 있습니다.

일반적으로 해결되는 방법은 문자열 및 엔터티 배열 대신 LinkedList 배열 (컬렉션을 사용할 수 없기 때문에 링크 된 목록을 구현 한 배열)을 가져와 목록에 엔터티를 저장해야한다는 것입니다. 이것은 당신의 해시 함수가 얼마나 좋은지에 의존하는 당신의 성능을 만들지 만, 이것은 많은 것은 아니지만 필요한 공간을 줄여 줄 것입니다. 그것이 실제로 Java의 해시 맵이 작동하는 방식입니다.

그냥 개인 메모에, 나는 정말 같은 색인에 같은 개체를 가지고 두 개의 배열에 의존하고 싶지 않아, 그것은 매우 오류가 발생하기 쉽습니다.

+0

나는 충돌을 다루는 방법을 아직 만들지 않았다.entryNames를 저장 한 배열이 이미 이름을 포함하고 있다면 나는 단지 1 씩 증가시키고 객체와 String을 다음 인덱스에 배치 할 계획이었습니다. – Liondancer

+1

그걸 처리하는 방법 중 하나는 그렇지만 그걸 처리해야 할 것입니다. 요소 'a'와 'b'를 사용하여 충돌이 발생하면 항목 'b'를 i + 1에 추가하지만 i + 1의 해시 코드가있는 항목 'b'가 있으면 ' 그래서 당신이 그것을 i + 1에 놓으면, 당신은 당신이 i + 1을 볼 'c'항목을 찾아야 만 할 것입니다. 이 상황이 확대되고 엉망이되어 코드가 엉망이 될 수 있습니다. :) – maczikasz