Ключи Java HashMap не выводят свои правильные значения

Итак, я пытаюсь создать базовую программу для преобразования шестнадцатеричного числа в двоичное, просто используя хэш-карту. По какой-то причине каждый ключ ниже «8» выводит значение, не являющееся двоичным. Пример: 5 должен выводить 0101, но вместо этого выводит 65. Ниже в основном хеш.

    map.put('1', 0001);
    map.put('2', 0010);
    map.put('3', 0011);
    map.put('4', 0100);
    map.put('5', 0101);
    map.put('6', 0110);
    map.put('7', 0111);
    map.put('8', 1000);
    map.put('9', 1001);
    map.put('A', 1010);
    map.put('B', 1011);
    map.put('C', 1100);
    map.put('D', 1101);
    map.put('E', 1110);
    map.put('F', 1111);

    System.out.println(map.get('5'));

Я работаю над этим, но мне действительно любопытно, почему это происходит.

Опечатка; вам не хватает 0x перед числами, чтобы не делать их восьмеричными, как сейчас.

Makoto 31.03.2018 01:25

Значения, вероятно, должны быть строками, например, «0101».

cpp beginner 31.03.2018 01:29

Карты должны отображать символы в строки.

Sergey Kalinichenko 31.03.2018 01:29

Ваш map бесполезен. System.out.println(Integer.toBinaryString(Integer.parseInt("‌​F", 16)));, а другой путь - System.out.println(Integer.toHexString(Integer.parseInt("111‌​1", 2)));

Elliott Frisch 31.03.2018 01:31

@dasblinkenlight хорошо, круто. Я все равно собирался сделать все на струнах. Спасибо чувак. Я новичок в этом, поэтому все еще изучаю простые вещи.

William Scribner 31.03.2018 01:31
0101 в восьмеричной системе счисления - это 65.
Tripp Kinetics 31.03.2018 01:32

@ Эллиотт круто, спасибо

William Scribner 31.03.2018 01:32

Ваша IDE, вероятно, должна выделять числа, начинающиеся с 0 (в IntelliJ они кажутся коричневыми) - такие числа интерпретируются как основание 8, что почти никогда не является тем, что вы хотите.

cpp beginner 31.03.2018 01:35

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

Levent Divilioglu 31.03.2018 01:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина

Поскольку в следующей строке вы используете восьмеричное представление, потому что вы начинаете с 0. В восьмеричном представлении base-8 0101 обозначает 65, и поскольку вы сопоставляете символ 5 с этим значением, целочисленное значение восьмеричного 0101 вычислено, как показано ниже;

1 * 8 ^ 2 + 0 * 8 ^ 1 * + 1 * 8 ^ 0 = 64 + 0 = 1 = 65

Вам нужно сопоставить значения в целочисленном формате, нет необходимости использовать восьмеричное или двоичное. Значения не меняются, но изменяется представление.

B - Демо-код ошибки

package com.levo.so.maprelated;

import java.util.HashMap;
import java.util.Map;

public class HexMapFailDemo {

    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<>();

        map.put('1', 0001);
        map.put('2', 0010);
        map.put('3', 0011);
        map.put('4', 0100);
        map.put('5', 0101);
        map.put('6', 0110);
        map.put('7', 0111);
        map.put('8', 1000);
        map.put('9', 1001);
        map.put('A', 1010);
        map.put('B', 1011);
        map.put('C', 1100);
        map.put('D', 1101);
        map.put('E', 1110);
        map.put('F', 1111);

        System.out.println(map.get('5'));
        System.out.println("Octal 101 = 8^2 + 1 = " + (8*8 + 1));
    }

}

C - Выход

65
Octal 101 = 8^2 + 1 = 65

D - Успешный демонстрационный код

package com.levo.so.maprelated;

import java.util.HashMap;
import java.util.Map;

public class HexMapSuccessDemo {

    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<>();

        map.put('1', 1);
        map.put('2', 2);
        map.put('3', 3);
        map.put('4', 4);
        map.put('5', 5);
        map.put('6', 6);
        map.put('7', 7);
        map.put('8', 8);
        map.put('9', 9);
        map.put('A', 10);
        map.put('B', 11);
        map.put('C', 12);
        map.put('D', 13);
        map.put('E', 14);
        map.put('F', 15);

        System.out.println(map.get('5'));
    }

}

E - Выход

5

Другие вопросы по теме