Как напечатать ключ значений в HashMap с помощью потока - PullRequest
0 голосов
/ 03 июля 2018

Пожалуйста, помогите мне с этим кодом ниже

Я получаю вывод, подобный этому

Enter name:Chaya
[455-567-8888, 655-884-4557, 811-115-5556]
Enter phone: 7666644556
7666644556 = [Chaya]
I need to get an output like this
Enter name: Chaya
455-567-8888
655-884-4557
811-115-5556
Enter phone: 7666644556
7666644556 = Bhanu

Я не смог решить проблему вывода имени, он печатает «Чая» вместо «Бхану». Можно ли использовать метод toString для печати значений телефонного номера
Пожалуйста, уточните .....

public class PhNo 
{
    private static String name;
    private static long phno;

    public static void main(String[] args) 
    {
            HashMap<String, List<Long>> map = new HashMap<String, List<Long>>();
            List<Long> One = new ArrayList<Long>();
            One.add(1111111111L);
            One.add(9444445555L);

            List<Long> Two = new ArrayList<Long>();
            Two.add(7666644556L);

            List<Long> Three = new ArrayList<Long>();
            Three.add(4555678888L);
            Three.add(6558844557L);
            Three.add(8111155556L);

            List<Long> Four = new ArrayList<Long>();
            Four.add(4555678899L);
            Four.add(6558844566L);
            Four.add(8666655556L);

            map.put("Arya", One);
            map.put("Bhanu", Two);            
            map.put("Chaya", Three);
            map.put("Dhamu", Four);

            System.out.println("Enter name: ");
            Scanner userInput = new Scanner(System.in); 
            name = userInput.nextLine();

            List<Long> phoneNum = map.get(name);
            System.out.println(String.valueOf(phoneNum).replaceAll("(\\d{3})(\\d{3})(\\d+)", "$1-$2-$3"));                    

            System.out.println("Enter phone: ");              
            phno = userInput.nextLong();    

            System.out.println(phno+" = "+ getKeysByValue(map));

     }

    static List<String> getKeysByValue(Map<String, List<Long>> map) 
    {
     return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getKey(), name))
              .map(Map.Entry::getKey)
              .collect(Collectors.toList());        
    }
}

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете использовать:

static String getName(Map<String, List<Long>> users, Long phone) throws Exception {
    return users.entrySet()
            .stream()
            .filter(entry -> entry.getValue().contains(phone))
            .findFirst()
            .map(user -> user.getKey())
            .orElseThrow(() -> new Exception("No result found"));
}

Примечание:

  • Ваше имя метода должно быть значимым (вместо этого измените его на getName)
  • Я предполагаю, что ваш метод должен возвращать строку (имя пользователя, у которого есть этот номер телефона), а не список длинных
  • Что если ваш метод не найдет никакого результата? (Вы можете выбросить исключение)
  • Код будет более читабельным, если значение phno будет передано в качестве второго аргумента метода (спасибо Смущение ), а затем вызовите свой метод следующим образом getName(map, phno)
  • Дизайн, который вы используете, совсем не хорош, вместо этого я бы предложил создать класс пользователей, которые содержат имя пользователя и список телефонных номеров. Его будет легко читать и манипулировать.
  • Имя переменных должно быть в нижнем регистре, а не в верхнем регистре

Of Если вы хотите получить все имена пользователей, у которых есть этот номер телефона, вы можете использовать:

static List<String> getNameOfUsersByPhoneNumber(Map<String, List<Long>> map, Long phone) {
    return map.entrySet()
            .stream()
            .filter(entry -> entry.getValue().contains(phone))
            .map(entry->entry.getKey())
            .collect(Collectors.toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...