2014-12-11 5 views
0

Я не знаю, почему не работает со мной. У меня есть пустые ключи на карте, но я не могу их поймать.Java: найти пустой ключ на карте:

Map<String, Long> map = new TreeMap<>(); 

//put data 

map.entrySet().stream().forEach(e -> { 
    if (e.getKey().equals("") || e.getKey().equals(" ") || e.getKey() == "" || e.getKey() == " ") { 
     map.remove(e.getKey(), e.getValue()); 
    } 
}); 

Отредактировано: Я сделал тест на значение:

 map.entrySet().stream() .forEach(e -> { 
      if (e.getValue() == 133835) { 
      System.out.println("key empty: " + e.getKey().isEmpty()); 
      System.out.println("key: >" + e.getKey() + "<"); 
      System.out.println("val: " + e.getValue()); 
     } 
    }); 

    map = map.entrySet().stream().filter(
      p -> !"".equals(p.getKey().trim())). 
      collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 


map.entrySet().stream() .forEach(e -> { 
    if (e.getValue() == 133835) { 

     System.out.println("key empty: " + e.getKey().isEmpty()); 
     System.out.println("key: >" + e.getKey() + "<"); 
     System.out.println("val: " + e.getValue()); 
    } 
}); 

результат является:

key empty: false 
key: >‏< 
val: 133835 
key empty: false 
key: >‏< 
val: 133835 

Я думаю, что этот ключ является гост)

+0

"У меня есть пустые ключи в карте, но я могу их поймать.".. - это предложение не имеет смысла. Что вы пытаетесь сделать, и что происходит вместо того, что вы пытаетесь сделать? – user2357112

+0

Можете ли вы указать, в чем проблема? что не работает для вас? что вы ожидаете? как вы помещаете данные? – ochi

+0

Из редактирования, кажется, он не может поймать/найти ключи, которые являются пустыми строками на его карте. – Sentry

ответ

0

первую очередь я обычно предлагаю обрезать вместо проверки на "" m (одно пространство) и "" (пустая строка). А во-вторых, это может быть так (ключ с более чем одним пространством).

"".equals(e.getKey().trim()) 

редактировать пример: Карта Карта = новый TreeMap();

 map.put("", 1L); 
     map.put(" ", 2L); 
     map.put("3", 3L); 

     map.entrySet().stream().forEach(e -> { 
      System.out.println("key empty: " + e.getKey().isEmpty()); 
      System.out.println("key: >" + e.getKey() + "<"); 
      System.out.println("val: " + e.getValue()); 
     }); 
     map = map.entrySet().stream().filter(
       p -> !"".equals(p.getKey().trim())). 
       collect(Collectors.toMap(Entry::getKey, Entry::getValue));   

     map.entrySet().stream().forEach(e -> { 
      System.out.println("key empty: " + e.getKey().isEmpty()); 
      System.out.println("key: >" + e.getKey() + "<"); 
      System.out.println("val: " + e.getValue()); 
     }); 

выход:

key empty: true 
key: >< 
val: 1 
key empty: false 
key: > < 
val: 2 
key empty: false 
key: >3< 
val: 3 
AFTER REMOVAL 
key empty: false 
key: >3< 
val: 3 
+0

Как это отвечает на вопрос? –

+0

не отвечает, но может быть поворот в правильном направлении. для меня он кажется, что пустой ключ для него определяется как строка, соответствующая одному пробелу или «». Так что, возможно, String с двумя bnalks qulifies как пустая, а также не будет fdund его кодом. – wgitscht

+0

Я пробовал, но все еще не работал –

1

Попробуйте использовать e.getKey() обрезать() IsEmpty()

+0

У меня теперь только System.out.println ("found"), это не проблема –

+0

key.trim(). IsEmpty() звучит как правильный способ проверить это. Могут быть экзотические символы, которые не печатаются в вашей локали, которую trim() не удаляет. – Andreas

+0

Это все тот же результат: ключ пуст: false –