2012-01-15 2 views
3

Так я могу написать:
Java: Как я могу написать HashMap <String, HashMap <Integer, ArrayList <Integer> >> в файл?

HashMap<String, ArrayList<Integer>> ... 

, но когда речь идет о структуре, как

HashMap<String, HashMap<Integer, ArrayList<Integer>>> ... 

я не ...

Set<String> keys = outer.keySet(); 
List<String> list = sortList(keys); 
Iterator<String> it = list.iterator(); 
HashMap<Integer,ArrayList<Integer>> inner=new HashMap<Integer,ArrayList<Integer>>(); 
       while (it.hasNext()) { 
        String key = it.next(); 
        Set<Integer> ids= inner.keySet(); 
        List<Integer> positions=sortList(ids); 
        Iterator<Integer> itIn=positions.iterator(); 
        while(itIn.hasNext()){ 
         String id= it.next(); 
         output.write(key + "\t" + outer.get(key) + " " +inner.get(id) +"\n"); 
        } 
       } 

Мой код может написать все внешние ключи имеют и первые элементы Integer1, но не могут видеть список или так далее.
Как я могу установить соединение с внутренним хэшмапом и внешним хэшмапом?

+0

Вы действительно хотите написать этот код? Посмотрите на переменную 'inner', вы создаете ее прямо сейчас, и вы хотите перебрать ее? Эта коллекция пуста, поэтому внутри нее не может быть никаких значений. – SHiRKiT

+0

Я не хотел, это лучшая грубая идея, которую я имел. да, я не мог понять, как интегрировать внешние значения во внутренний – anonym

+0

. Затем перестаньте думать о хэшмапах, arraylists и дальше, и начните думать как матрицу. Что у вас там? Действительно специальная карта. Вы перенаправляете значения Srings в Integer и затем в Integer. Итак, думая в трехмерной матрице, у нас есть матрица [String] [Integer] [Integer]. Попробуйте этот подход, если вы можете придумать лучшее решение. Но это действительно похоже на ошибку в подходе. Подумайте, как 3D-матрицу, и вы ее получите. Я успешно сделал идею сериализации 3D-матрицы, но при использовании 'HashMap >>' все стало очень сложно. – SHiRKiT

ответ

3

Как насчет хранения всего объекта в файле через ObjectOutputStream? Что-то вроде:

public static void saveObject(HashMap<String, HashMap<Integer, ArrayList<Integer>>> obj, String filePath) 
{ 
    OutputStream os = null; 
    try 
    { 
     os = new ObjectOutputStream(new FileOutputStream(filePath)); 
     os.writeObject(obj); 
    } 
    catch(Exception ex){} 
    finally 
    { 
     os.close(); 
    } 
} 

Затем вы можете загрузить его любит:

public static HashMap<String, HashMap<Integer, ArrayList<Integer>>> loadObject(String filePath) 
{ 
    HashMap<String, HashMap<Integer, ArrayList<Integer>>> obj = null; 
    InputStream is = null; 
    try 
    { 
     is = new ObjectInputStream(new FileInputStream(filePath)); 
     obj = (HashMap<String, HashMap<Integer, ArrayList<Integer>>>) is.readObject(); 
    } 
    catch(Exception ex){} 
    finally 
    { 
     is.close(); 
    } 
    return obj; 
} 

Обратите внимание, что вам нужно реализовать интерфейс Serializable использовать этот объект сериализацию.

0

Сериализовать переменную inner, она позаботится о сериализации всех ссылок, которые она хранит внутри.

В качестве примечания, почему вам нужна такая вложенная структура данных? он пахнет проблемой дизайна.

+0

Я храню, индексы позиции и идентификаторы файлов для каждого уникального слова в большом наборе данных. Чтобы сделать это, я подумал, что это будет лучше. – anonym

+0

Но, конечно же, вы могли бы как-то упростить дизайн, то, что вы создаете, является головной болью ремонтопригодности –

Смежные вопросы