Как вычислить хэш-код () от адреса объекта?

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

 @Override
        public void onClick(View view) {
            ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(selectedItem);
            if (holder != null) {
                holder.expandButton.setSelected(false);
                holder.expandableLayout.collapse();

            }

            int position = getAdapterPosition();


            //dynamic Listview Height calculate start
            float scale = view.getContext().getResources().getConfiguration().fontScale;

            int hh = 0;
            try {
                WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                int width = display.getWidth();  // deprecated
                int height = display.getHeight();  // deprecated


                View childView = listdetail.getAdapter().getView(0, null, listdetail);
                childView.measure(UNBOUNDED, UNBOUNDED);
                hh=childView.getMeasuredHeight();
            } catch (Exception e) {
                e.printStackTrace();
            }
            int scl = (int)(scale * (12f));
            scl = scl<=0?1:scl;
            ViewGroup.LayoutParams params = listdetail.getLayoutParams();
            if(hh<=0) {
                params.height = 10 * (listdetail.getAdapter().getCount()) * scl;
            }
            else {
                params.height = (int) (((scale<0f?1f:1f) *hh * (listdetail.getAdapter().getCount()))+10);
            }
            listdetail.setLayoutParams(params);

            //dynamic Listview Height calculate stop

            if (position == selectedItem) {
                selectedItem = UNSELECTED;
            } else {
                expandButton.setSelected(true);
                expandableLayout.expand();
                selectedItem = position;

            }
        }
5
задан Thomas 24 September 2008 в 18:21
поделиться

7 ответов

Любое использование System.identityHashCode () или использование IdentityHashMap.

10
ответ дан 14 December 2019 в 01:21
поделиться

System.identityHashCode() возвращает тот же хэш-код для данного объекта, как был бы возвращен методом по умолчанию hashCode(), переопределяет ли класс данного объекта hashCode().

1
ответ дан 14 December 2019 в 01:21
поделиться

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


class Vertex extends Point3f{
   private final Object equalsDelegate = new Object();
   public boolean equals(Object vertex){
      if(vertex instanceof Vertex){
         return this.equalsDelegate.equals(((Vertex)vertex).equalsDelegate);
      }
      else{
         return super.equals(vertex);
      }
   }
   public int hashCode(){
      return this.equalsDelegate.hashCode();
   }
}
0
ответ дан 14 December 2019 в 01:21
поделиться

Просто к вашему сведению, Ваш равняется методу, НЕ нарушает, равняется контракту (для контракта базового объекта, который является)..., который является в основном, равняется методу для метода базового объекта, поэтому если Вы хотите идентификационные данные, равняется вместо Вершины, равняется, который прекрасен.

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

Причина Вы не должны изменять его, состоит в том, потому что это абсолютно прекрасно, что хэш-код возвратит то же значение для объектов, которое равняется, возвращает false... это - даже действительный хэш-код, чтобы просто возвратиться 0 все время для КАЖДОГО экземпляра. Эффективно ли это для хеш-таблиц, совершенно другая проблема... Вы получите намного больше коллизий, если много Ваших объектов имеет тот же хэш-код (который может иметь место, если Вы оставили хэш-код в покое и имели много вершин с теми же значениями).

Не принимайте это как ответ, хотя, конечно (то, что Вы выбрали, намного более практично), я просто хотел дать Вам немного больше вводной информации о хэш-кодах и равняюсь ;-)

0
ответ дан 14 December 2019 в 01:21
поделиться

Почему Вы хотите переопределить хэш-код () во-первых? Вы хотели бы сделать это, если Вы хотите работать с некоторым другим определением равенства. Например,

общедоступный класс A {международный идентификатор;

общедоступная булевская переменная равняется (Другой) {возвращают other.id == идентификатор} общедоступный международный хэш-код () {идентификатор возврата;}

}, где Вы хотите быть ясными, что, если идентификатор является тем же затем, объекты являются тем же, и Вы переопределяете хэш-код так, чтобы Вы не могли сделать этого:

HashSet хешируют = новый HashSet (); hash.add (новый (1)); hash.add (новый (1)); и получите 2 идентичных (с точки зрения Вашего определения равенства) A. Корректное поведение затем состояло бы в том, что у Вас только будет 1 объект в хеше, вторая запись перезаписала бы.

0
ответ дан 14 December 2019 в 01:21
поделиться

Функциональный хэш-код () наследован от Объекта и работает точно, как Вы предназначаете (на уровне объектов, не координатном уровне). Не должно быть никакой потребности изменить его.

Что касается Вашего равняться-метода, нет никакой причины даже использовать его, так как можно просто сделать, obj1 == obj2 в коде вместо использования равняется, так как это предназначено для сортировки и подобный, где сравнение координат имеет намного больше смысла.

-2
ответ дан 14 December 2019 в 01:21
поделиться

Так как Вы не используете, равняется как логическое сравнение, но физическое (т.е. это - тот же объект), единственный способ, которым Вы гарантируете, что хэш-код возвратит уникальное значение, состоит в том, чтобы реализовать изменение Вашего собственного предложения. Вместо того, чтобы генерировать случайное число, используйте UUID для генерации фактического уникального значения для каждого объекта.

System.identityHashCode () будет работать, большую часть времени, но не гарантируется как Object.hashCode (), метод, как гарантируют, не возвратит уникальное значение для каждого объекта. Я видел, что крайний случай происходит, и это будет, вероятно, зависеть от реализации VM, которая не является чем-то, от чего Вы захотите свой код зависеть.

Выборка от javadocs для Object.hashCode (): так, как довольно практично, метод хэш-кода, определенный объектом класса, действительно возвращает отличные целые числа для отдельных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования JavaTM.)

Проблема, которую это решает, имеет место наличия двух отдельных точечных объектов от перезаписи друг друга при вставке в hashmap, потому что у них обоих есть тот же хеш. С тех пор там не логично, равняется, с сопроводительным переопределением хэш-кода (), identityHashCode метод может на самом деле заставить этот сценарий происходить. Где логический случай только заменил бы записи хеша для той же логической точки, использование основанного на системе хеша может заставить это происходить с любыми двумя объектами, равенство (и даже класс) больше не является фактором.

0
ответ дан 14 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

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