Отображение (x, y) на однозначное значение - PullRequest
3 голосов
/ 27 января 2011

Я хочу, чтобы функция отображала значение (x, y) в одно числовое значение и соответствующее обратное отображение в Java.

Например, (2,34) должно отображаться в какое-то значение 100, и если мыесть 100, мы должны быть в состоянии найти (2,34).

Ответы [ 8 ]

6 голосов
/ 27 января 2011

Ну, если у вас есть максимальное значение для одного из них, тогда да. Скажем, y ограничен 0 ... 9999, затем может сделать:

int num = x * 10000 + y;

(при условии, конечно, что результат будет соответствовать типу - вы можете при необходимости обновить его до более широкого типа, например long). Затем, чтобы вернуться:

int x = num / 10000;
int y = num % 10000;
3 голосов
/ 27 января 2011

Если у вас есть верхний предел (скажем, 100 выше для x в (x,y)), то вы можете связать любое n с парой значений (x,y) с помощью этой функции: n = x * 100 + y.

Если у вас нет ограничений, все становится сложнее. Способ связать число, принадлежащее R, с числом R^2 - это перечисление диагоналей. Посмотрите на этот пример, это матрица, в которой ячейка (x,y) содержит n, связанный с ней:

1  2  4  7  11 ..
3  5  8  12 ..
6  9  13 ..
10 ..
..
1 голос
/ 28 января 2011
public class hash {
public static void main(String args[]) throws IOException
    {
    HashMap<List<Integer>,List<Integer>> g=new HashMap<List<Integer>,List<Integer>>();
    List<Integer> xys=new ArrayList<Integer>();
    List<Integer> ss=new ArrayList<Integer>();
    System.out.println("Enter the coordinates in (x,y)");
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("x");
    int n1=Integer.parseInt(reader.readLine());
    System.out.println("y");

    int n2=Integer.parseInt(reader.readLine());
    xys.add(n1);
    xys.add(n2);
    int d=(int)(Math.pow(xys.get(0),xys.get(1)));

    ss.add(d);

   g.put(xys,ss);
   g.put(ss,xys);
        List<Integer> r= g.get(ss);

        List<Integer> r1=g.get(xys);

        System.out.print("Hash for the value (x,y) mapping");
        System.out.print(r1);


        System.out.print("Hash for the value N, reverse mapping");
        System.out.println(r);


}
}
1 голос
/ 27 января 2011

Помните, примитивные числа - это просто набор необработанных битов. Если ваши числа представляют собой 32-разрядные целые числа (int), вы можете удобно упаковать два из них в одно 64-разрядное целое число (long). Примерно так:

int a = 3;
int b = 4;
long c = ((long) a) << 16 | b;

...

a = (int) (c >> 16);
b = (int) (c & 0xffff);
1 голос
/ 27 января 2011

Вы должны взглянуть на HashMap . Кажется, что-то вроде HashMap<Integer, List<Integer>> хорошо работает для вашего случая.

0 голосов
/ 27 января 2011

Альтернативная стратегия, основанная на ответе paxdiablo, заключается в использовании десятичной точки, поэтому вы должны поместить компонент x перед десятичным знаком, а компонент y после него.

Это может повлечь за собой некоторую грязную обработку строк, но не имеет ограничения, необходимого для возможности привязки одной из ваших координат.

0 голосов
/ 27 января 2011

Каков фон для этого требования?

Если диапазон значений x, y неограничен, то нет способа сделать это уникальным способом (так что вы всегда можете полностью изменить процесс).

Если диапазон чисел ограничен, то вы можете сделать следующее: Предположим, что x и y равны int значениям в диапазоне от 0 до 99. Затем вы вычисляете результат по: z = 100 * x + y. Обратное будет: x = z / 100 и y = z % 100.

0 голосов
/ 27 января 2011

Вы можете хранить их как строку.

String a = "(2,34)";
String b = "100";

Map<String, String> m = new HashMap<String, String>();
m.put(a, b);
m.put(b, a);

/*print*/
System.out.println(m.get(a));
System.out.println(m.get(b));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...