Передающая переменная “константы” к методу в Java

Для каждой позиции мы хотели бы знать, какие ячейки указывают на нее.

1 2 4 5 4 1

5: 3
4: 2, 4 (leader)
3: None
2: 1
1: 0, 5
0: None

Теперь следуйте назад от лидера:

Who's looking at 4?
  -> 2
[x, x, 1, x, 0, x]

Who's looking at 2?
  -> 1
[x, 2, 1, x, 0, x]

Who's looking at 1?
  -> 0 and 5
[3, 2, 1, x, 0, 3]

Who's looking at 0 or 5?
  -> 3
[3, 2, 1, 4, 0, 3]

Псевдокод:

// For each position, we'd like to know
// which cells are pointing to it
A = input array
leader = None
map = {}

for i=0 to length(A)-1:
  if i = A[i]:
    leader = i

  if i != leader:
    if A[i] in map:
      map[A[i]].append(i)
    else:
      map[A[i]] = [i]


//Now follow backwards from the leader
output = Array(length(A))
next = leader
output[leader] = 0
rank = 0

// Assumes the data provides
// for a straightforward solution.
// There may be edge cases to work
// out if that's not the case.
while next:
  for i in map[next]:
    next = None
    if i in map:
      next = i
      rank = rank + 1
      for j in map[next]:
        output[j] = rank
      break
11
задан LK. 2 February 2009 в 07:20
поделиться

6 ответов

Нет, нет.

Java "финал" не является точным эквивалентом C++ "константа". Следующее (задержанная инициализация последней переменной) работает в Java:

final double x;
int w = 1;
if (w > 2)
{
    x = 0.5;
}
else
{
    x = - 0.5;
}

но это не работает в C++ с "финалом", замененным "константой".

Используя "финал" на переменной в объявлении метода может быть полезным в Java, потому что позволяет Вам использовать эту переменную в любом анонимном классе, созданном в Вашем методе.

PS. Я был сначала разочарован отсутствием "константы" в Java, но позже учился жить с "финалом".

PS2. Глоссарий Java (http://mindprod.com/jgloss/immutable.html), связанный с в этом потоке, имеет одну вещь неправильно: нет, Вам не дают 100%-ю гарантию, что последняя переменная не изменяет свое значение:

1) это изменяется от "неопределенного" до "определенного", но компилятор скажет Вам при ссылке на него перед инициализацией

2) на Linux двойное имеет 80-разрядную точность при хранении в регистре, но 64-разрядный при хранении в памяти. Когда финал удваивается, переменная продвинута из регистра, это будет усеченным и изменит свое значение. Как Joel Spolsky говорит, "абстракция дала течь".

15
ответ дан 3 December 2019 в 02:53
поделиться

BTW: Java действительно имеет константу как ключевое слово, но Вы не можете использовать его нигде.

5
ответ дан 3 December 2019 в 02:53
поделиться

Java не имеет ничего как понятие C++ константы. Это - предмет некоторого спора, хотя интересно отметить, что.NET не делает также. Я полагаю, что причины:

  • Получение понятного синтаксиса становится довольно хитрым (IMO) - сообщение различия между списком константы изменяемого StringBuilders и изменяемым списком константы, StringBuilders и т.д. является трудным. (Мне, конечно, было трудно в C++, хотя это могло произойти из-за отсутствия практики.)
  • Я сильно подозреваю, что не было бы приемлемо позволить constness быть выброшенным на управляемых языках. Это шло бы вразрез с мелкой частицей всего этого. Это могло сделать их тяжелее для работы с во многих случаях.
  • Распространение информации о constness во время выполнения (для предотвращения возможности его выбрасываемый) может быть трудным и/или дорогим в условиях производительности
  • Как Java (и.NET) не имели constness, в прошлом представляющего его поздно на в игре, является чрезвычайно трудным - если все общие библиотеки не поддерживают его (и разбираются в нем на каждом шаге!) Вы заканчиваете с противной путаницей, и действительно это может быть абсолютно неосуществимо, если необходимо пользоваться двумя библиотеками, одна из которых не знает о constness и другие из которых только предоставляют значения константы.
8
ответ дан 3 December 2019 в 02:53
поделиться

Как выше, нет в Java нет никакой константы. Но когда мы хотим достигнуть 'близкий' к тому же результату в Java, мы используем

public static final Object x = somedata;

Это устанавливает данные в той точке и раскрытии утечек абстракции и т.д, Вы имеете как близко к эквиваленту, поскольку можно добраться.

1
ответ дан 3 December 2019 в 02:53
поделиться

Самый близкий Java, эквивалентный для const final.

void func(final SomeClass x) {
  // The following causes a compiler error
  x = ...;

  // The following works. If you don't want it to, then you have to make
  // somevar final or write a getter (but not a setter) for it in SomeClass.
  x.somevar = ...;
}
0
ответ дан 3 December 2019 в 02:53
поделиться

Посмотрите это для достижения этого в Java: Неизменные объекты в Java

1
ответ дан 3 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: