2013-06-20 3 views
0

У меня есть карта типа Object, мне нужно преобразовать эту карту в тип String.Как преобразовать карту <объект, объект> в карту <String, String> в java?

Map<String, String> map = new HashMap<String, String>();  
Properties properties = new Properties();  
properties.load(instream);  

Может ли любое тело рассказать мне, как назначить свойства на карте выше?

Благодаря & С уважением, Msnaidu

+0

Что это за объект? –

+0

проверить это http://stackoverflow.com/a/3958306/1862502 –

+1

@TimothyGroote - я думаю, что это очень вероятно, что это будет 'java.util.Properties'. –

ответ

3

Чистейшим способом добавить свойства к карте будет (вслед из вашего примера):

for (String propName : properties.stringPropertyNames()) { 
    map.put(propName, properties.getProperty(propName)); 
} 

Этих прекрасно работает в этом конкретном случае, потому что объект Properties действительно представляет собой карту, содержащую клавиши и значения String, поскольку метод getProperty дает четкое представление. Он объявлен как Map<Object, Object> по причинам ужасной обратной совместимости.

Использование методов, специфичных для свойств, вместо того, чтобы рассматривать это как только Map<Object, Object>, вы можете заполнить Map<String, String> идеальной безопасностью (вместо того, чтобы бросать).

+0

Мне было интересно узнать о причинах, по которым свойства HashMap и нашли это http://stackoverflow.com/questions/873510/why-does-java-util-properties-implement-mapobject-object-and-not -mapstring-st – JohnEye

0
Map<String,String> getPropInMap(Properties prop){  
    Map<String, String> myMap = new HashMap<String, String>(); 
    for (Object key : prop .keySet()) { 
     myMap.put(key.toString(), prop .get(key).toString()); 
    }  
    return myMap; 
} 
3
Map<String, String> properties2Map(Properties p) { 
      Map<String, String> map = new HashMap<String, String>(); 
      for(Map.Entry<Object, Object> entry : p.entrySet()) { 
       String key = (String) entry.getKey(); //not really unsafe, since you just loaded the properties 
       map.put(key, p.getProperty(key)); 
      } 
      return map; 
} 

Я также хотел бы использовать вспомогательные методы с аргументами типа ходить вокруг общего типа инвариантности и сделать некоторые «понижающее приведение» или «приведение к базовому типу» (когда я знаю это безопасно). В этом случае:

@SuppressWarnings("unchecked") 
<A, B extends A> Map<B, B> downCastMap(Map<A,A> map) { 
    return (Map<B, B>)map; 
} 

Тогда вы можете написать

Properties p = ... 
Map<String, String> map = downCastMap(p); 
+0

Могу ли я поставить он похож на Map map = (Map) свойства; –

+0

Да, подавление rawtypes и unchecked. Тем не менее, метод утилиты больше документирует код для любого другого (и самого себя), читающего код. – dkateros

1

Поскольку мы знаем, что свойства уже являются привязкой к String-to-String, это сохранить, чтобы сделать это с использованием rawtype и unchecked conversion. Просто оставьте комментарий:

Properties properties = new Properties();  
    properties.load(instream); 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    // this is save because Properties have a String to String mapping 
    Map<String, String> map = new HashMap(properties); 
+0

Да, но зачем создавать новый экземпляр HashMap в этом процессе? – dkateros

+0

Потому что мы не можем * изменить * или * cast * экземпляр свойств на тип 'Map ', потому что он реализует интерфейс 'Map '. –

+0

Посмотрите на мой ответ выше и комментарии. – dkateros

3

Вы можете напрямую конвертировать:

Properties properties = new Properties(); 
Map<String, String> map = new HashMap<String, String>((Map)properties); 
0

перебирать карты объекта, возьмем к V, сделать их строку и поместить его на карте String.

Map<Object,Object> map1; // with object k,v 
Map<String, String> mapString = new HashMap<String, String>(); 
for (Object key : map1.keySet()) { 
       String k = key.toString(); 
       String v = mmap1.get(key).toString(); 
       mapString.put(k, v); 
      } 
Смежные вопросы