Хеш-таблицане найти строки - PullRequest
2 голосов
/ 08 января 2010

У меня есть Hashtable типа Hashtable

Я загрузил несколько строк в качестве ключей, одна из которых "ABCD"

Однако позже, когда я посмотрю «ABCD», Hashtable возвращает ноль вместо связанного объекта. Кроме того, набор ключей содержит «ABCD», но запрос к содержащемуся ключу («ABCD») возвращает false.

Это потому, что объекты String по своей природе являются разными объектами?

Если это так, как можно записать информацию в Hashtable, если я хочу использовать строки в качестве ключей?

 public class Field {
        private String name;
        private DataType dataType;

        public Field(String name, DataType dataType) {
            this.name = name;
            this.dataType = dataType;
        }

        public String getName() {
            return name;
        }

        public DataType getDataType() {
            return dataType;
        }

        public String toString() {
            return name;
        }
    }

public class Record {
        private Hashtable<String, Data> content; 

        public Record(Field[] fieldList) {
            this.fieldList = fieldList;     
            content = new Hashtable<String, Data>();

            System.out.println(fieldList.length);

            for(Field f : fieldList) {          
                content.put(f.getName(), new Data());
            }
        }

        public void add(String field, String s) {
                    // ERROR OCCURS HERE IN THIS METHOD !!!

            System.out.println(field);

            for(String ss : content.keySet()) {
                System.out.print(" [ " + ss + " ] ");
            }
            System.out.println();

            System.out.println(content.containsKey(field));     
            System.out.println(content.get(field));

            content.get(field).add(s);
        }
}



public class Data {

    private Vector<String> lines;
    private int index;

    public Data() {
        lines = new Vector<String>();
        index = 0;
    }

    public void add(String s) {
        System.out.println("adding");
        lines.add(s);
    }

    public String nextLine() {
        try {
            return lines.elementAt(index++);
        } catch (ArrayIndexOutOfBoundsException aioobe) {
            return null;
        }
    }
}

Ответы [ 4 ]

8 голосов
/ 08 января 2010

У меня работает!

import java.util.Hashtable;

public class StrMap {
    public static void main(String[] args) {
        Hashtable<String,Object> map = new Hashtable<String,Object>();
        map.put("ABCD", "value");
        System.err.println(map.containsKey("ABCD"));
    }
}

Йо, вероятно, допустил какую-то другую ошибку. Уменьшите проблему до наименьшей полной скомпилируемой программы, которая все еще демонстрирует проблему. Вы, вероятно, сразу найдете проблему. Если вы этого не сделаете, по крайней мере, у вас будет вопрос, на который мы можем ответить.

(Кроме того, Map и HashMap - это то, что нужно. Hashtable полезно, если вы используете API до Java 2 (Java 2 уже более 10 лет!). *

0 голосов
/ 08 января 2010

Можете ли вы также опубликовать точный вывод, полученный с помощью следующего метода, когда поле "ABCD"?

   public void add(String field, String s) {
                // ERROR OCCURS HERE IN THIS METHOD !!!

        System.out.println(field);

        for(String ss : content.keySet()) {
            System.out.print(" [ " + ss + " ] ");
        }
        System.out.println();

        System.out.println(content.containsKey(field));     
        System.out.println(content.get(field));

        content.get(field).add(s);
    }
0 голосов
/ 08 января 2010

Трудно определить основную причину без SSCCE с вашей стороны.

По крайней мере, общие причины:

  1. Вы не используете Hashtable, который, как вы думаете, вы используете. System.out.println() это проверить.
  2. String на самом деле в другом случае, например "ABcD" вместо "ABCD".
  3. String окружен пробелами, которые вам нужны для trim() первого.

С учетом сказанного (и не имеющего отношения к реальной проблеме) я настоятельно рекомендую использовать улучшенный HashMap вместо устаревшего Hashtable. Вот учебник Sun по картам .

0 голосов
/ 08 января 2010

Hashtable - это структура данных Java 1.0. Интересно, почему вы не используете карту?

Если java.lang.String является типом ключа, я бы сказал, что вас преследует что-то еще, что невозможно угадать без публикации кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...