2012-05-28 2 views
0

Я хочу создать свой собственный диапазон чисел в Java и по-прежнему использовать обычные. Я просто не могу решить эту проблему! Это без жесткого кодирования каждого результата.Как добавить собственный диапазон номеров в java

Предположим, Целые числа идут как 0, 1, 2, 3, 4, 5, 6, 7, 8 .... и так далее (я знаю! есть и отрицательные int's)

Теперь я хотел бы сделать свои собственные «числа», которые могут использоваться как целые числа, так и их собственный тип.

Простой срез номеров чисел: 1, 2, 3, 5, 4, 7, 6, 9, 10, 11, 8, 13, 14, 15, 12, 17, 18, 19, 20, 21, 22, 23, 16 ... и т. Д. Список всех номеров приведен ниже. (Я не нужны никакие цифры выше 767, но следующий номер 512, то 769+ и так один.

 
1 
2 
3 
5 
4 
7 
6 
9-11 
8 
13-15 
12 
17-23 
16 
25-31 
24 
33-47 
32 
49-63 
48 
65-95 
64 
97-127 
96 
129-191 
128 
193-255 
192 
257-383 
256 
385-511 
384 
513-767 

Теперь давайте называть эти цифры TNI, (напротив междунар)

Допустим, я 'd like to add (int) A to (tni) B Это должна быть нормальная математика. Поэтому, если A = 4 и B = 6, результат будет равен 10, а не 8.

Но если я хочу посмотреть, какие один из 2 tni является самым высоким. Скажем, A = 8 и B = 10, id скажет мне, что A выше, как и в диапазоне tni, 8 приходит после 10.

Возможно ли это?

+6

Не знаю о других, но я ничего не понял. –

+1

Нет, это невозможно. Вы должны создать свой собственный класс и выполнить все математические и преобразования с помощью методов этого класса, вы не можете перегружать + оператор или кастинг. –

+0

в порядке. грустно, но спасибо, тогда плохо сделайте это с трудом ... thx для вашего времени, плохо вернитесь через 2 часа и примите этот ответ, если никто другой не скажет мне, что вы ошибаетесь (я нет, вы не, но я надеюсь. .. :)) – JavaApprentis

ответ

1

Лучший способ, которым я вижу это, - создать массив, обозначающий положение «нормального» int в последовательности tni.

Например:

int[] tniArray = new int[768]; 

tniArray[0] = 0; 
tniArray[1] = 1; 
tniArray[2] = 2; 
tniArray[3] = 3; 
tniArray[4] = 5; //This is because the number 4 comes at position 5 in the tni sequence 
tniArray[5] = 4; 
tniArray[6] = 7; 
tniArray[7] = 6; 
tniArray[8] = 11; 
//etc. 

Затем, вы можете сравнить их с методом, как это:

boolean IntGreaterThanTni(int Int, int Tni){ 
    return (Int > tniArray[Tni]); 
} 

Да, это довольно безвкусное решение, но кажется, что у вас есть безвкусные проблема в первую очередь.

+0

Это хороший ответ - это напоминает мне аналогичную проблему из «Programming Pearls», удивленный, что я не думал об этом. Это гораздо более быстрое решение, чем мое, но требует дополнительного шага «настройки» для массива, соответствующего индексам. У вас может также возникнуть проблема с цифрами, которые вообще отсутствуют в последовательности, имеющей «специальное значение», например «-1», и поэтому всегда помечены как «до» любого числа, которое * равно * в последовательности , Это действительно зависит от определения точной задачи, что отнюдь не ясно. – Jon

+0

Да, Это то, что я имел в виду под жестким кодированием. Ну, это сработает. Спасибо :) Что касается его. Это проект на клеточных автоматах (см. Примеры жизни в Conways или петли Langton для некоторых примеров). В этих автоматах существуют различные типы ячеек, каждый из которых имеет значение, определенное на основе как их окружения, так и собственного значения. Каждый цикл программы, ячейка будет выглядеть со всех сторон, чтобы узнать, где она будет иметь лучшие значения. Теперь лучшие значения приведены в массиве tni. Главным образом, чем выше, тем лучше, но есть некоторые золотые цифры, – JavaApprentis

+0

, которые расположены выше их фактического численного размещения. Эти золотые цифры 1, 2, 3, 4, 6, 8, 12, 16, 24, 32 ... и так одно. Надеюсь, что это дает немного света тому, что используется переднего плана. – JavaApprentis

0

Ваш вопрос довольно запутанный, но вот что я думаю, что вы имеете в виду. У вас есть упорядоченная последовательность чисел, которая не определяется какой-либо функцией. Вы хотите, чтобы узнать, находится ли заданное число в последовательности до или после другого в пределах одной последовательности.

Не похоже, что вы можете использовать что-либо вроде бинарного поиска для этого, поэтому, если вы хотите определить положение числа в последовательности, быстрый и грязный способ сделать это - перебрать последовательность из начало и остановку, когда вы найдете свой целевой номер. Потенциально это означает, что вы можете повторить всю последовательность в два раза, чтобы найти положение двух чисел A и B в пределах последовательности, а затем определить, идет ли она перед другим.

Код ниже делает то, что вы хотите. Это не очень OO, но он работает.

 

public class FunnySequence { 
    public static void main(String[] args) { 
     // First few numbers in the sequence 
     int arr[] = new int[]{ 
       1, 
       2, 
       3, 
       5, 
       4, 
       7, 
       6, 
       9, 
       10, 
       11, 
       8 
     }; 

     int a = 8; 
     int b = 10; 

     System.out.println("Position of A: "+ 
        findPosition(arr, a)); 
     System.out.println("Position of B: "+ 
        findPosition(arr, b)); 
    } 

    public static int findPosition(int[] arr, int num) { 
     for (int i = 0; i < arr.length; i++) { 
      if (num == arr[i]) { 
       return i; 
      } 
     } 
     return -1; 
    } 
} 
 
Смежные вопросы