Джошуа Блох говорит об эффективном Java
Вы должны переопределить hashCode () в каждом классе, который переопределяет equals (). Несоблюдение этого требования приведет к нарушению общего договора для Object.hashCode (), что предотвратит правильное функционирование вашего класса в сочетании со всеми коллекциями на основе хешей, включая HashMap, HashSet и Hashtable.
Попробуем понять это с примером того, что произойдет, если мы переопределим
equals()
без переопределенияhashCode()
и попытаемся использоватьMap
.Скажем, у нас есть класс как и это, и что два объекта из
MyClass
равны, если ихimportantField
равны (сhashCode()
иequals()
, сгенерированными затмением)public class MyClass { private final String importantField; private final String anotherField; public MyClass(final String equalField, final String anotherField) { this.importantField = equalField; this.anotherField = anotherField; } public String getEqualField() { return importantField; } public String getAnotherField() { return anotherField; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((importantField == null) ? 0 : importantField.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final MyClass other = (MyClass) obj; if (importantField == null) { if (other.importantField != null) return false; } else if (!importantField.equals(other.importantField)) return false; return true; } }
Только переопределение
equals
Если превышено только
equals
, тогда, когда вы вызываетеmyMap.put(first,someValue)
, сначала будет хеш к некоторому ведру, и когда вы вызываетеmyMap.put(second,someOtherValue)
, он будет хешировать в каком-то другом ковше (поскольку у них есть другойhashCode
]). Таким образом, хотя они равны, поскольку они не имеют хеша в одном и том же ковше, карта не может ее реализовать, и оба они остаются на карте.Хотя нет необходимости переопределить
equals()
, если мы переопределимhashCode()
, посмотрим, что произойдет в этом конкретном случае, когда мы знаем, что два объекта изMyClass
равны, если ихimportantField
равны, но мы не переопределяемequals()
.Только переопределение
hashCode
Представьте, что у вас есть
MyClass first = new MyClass("a","first"); MyClass second = new MyClass("a","second");
Если вы только переопределяете
hashCode
, тогда, когда вы вызываетеmyMap.put(first,someValue)
, это занимает сначала, вычисляет егоhashCode
и сохраняет его в данном ковше. Затем, когда вы вызываетеmyMap.put(second,someOtherValue)
, он должен заменить сначала вторым в соответствии с Documentation Document , потому что они равны (в соответствии с бизнес-требованием).Но проблема в том, что равен не было переопределено, поэтому, когда хэши карты
second
и повторяются через ведро, глядя, есть ли объектk
, такой, чтоsecond.equals(k)
истинно, он не будет найден, посколькуsecond.equals(first)
будетfalse
.Надеюсь, что было ясно
Функция pcl::io::loadPLYFile()
действительно то, что вы должны использовать для чтения файлов PLY. Чтобы решить проблему компиляции, убедитесь, что вы включили соответствующий файл заголовка (pcl/io/ply_io.h
).
Мы также можем создать PLYReader в качестве PCDReader, как показано ниже, чтобы прочитать файл PLY и все точки в нужное облако
#include<pcl/io/ply_io.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ);
pcl::PLYReader Reader;
Reader.read("Path of the PLY file", *cloud);