Пример использования:
objs.sort(sortBy('last_nom'));
Сценарий:
/**
* @description
* Returns a function which will sort an
* array of objects by the given key.
*
* @param {String} key
* @param {Boolean} reverse
* @return {Function}
*/
function sortBy(key, reverse) {
// Move smaller items towards the front
// or back of the array depending on if
// we want to sort the array in reverse
// order or not.
var moveSmaller = reverse ? 1 : -1;
// Move larger items towards the front
// or back of the array depending on if
// we want to sort the array in reverse
// order or not.
var moveLarger = reverse ? -1 : 1;
/**
* @param {*} a
* @param {*} b
* @return {Number}
*/
return function(a, b) {
if (a[key] < b[key]) {
return moveSmaller;
}
if (a[key] > b[key]) {
return moveLarger;
}
return 0;
};
}
То, что точно является Вами планирование выполнения с ним (что Вы хотите сделать, имеет значение с тем, что необходимо будет назвать).
hashCode
, как определено в JavaDocs, говорит:
так, как довольно практично, метод хэш-кода, определенный объектом класса, действительно возвращает отличные целые числа для отдельных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется Java™ язык программирования.)
Поэтому, если Вы используете hashCode()
, чтобы узнать, является ли это уникальный объект в памяти, которая не является хорошим способом сделать это.
System.identityHashCode
делает следующее:
Возвраты тот же хэш-код для данного объекта, когда был бы возвращен хэш-кодом метода по умолчанию (), переопределяет ли класс данного объекта хэш-код (). Хэш-код для нулевой ссылки является нулем.
то, Которое, поскольку то, что Вы делаете, походит на то, что Вы хотите..., но что Вы хотите сделать, не могло бы быть безопасным в зависимости от того, как библиотека реализована.
Вы не можете безопасно сделать то, что Вы хотите, так как хэш-код по умолчанию () не может возвратить адрес и был упомянут, несколько объектов с тем же хэш-кодом возможны. Единственный способ выполнить, что Вы хотите, состоит в том, чтобы на самом деле переопределить хэш-код () метод для рассматриваемых объектов и гарантировать, что они все обеспечивают уникальные значения. Выполнимо ли это в Вашей ситуации, другой вопрос.
Для записи, я испытал несколько объектов с тем же хэш-кодом по умолчанию в VM IBM, работающем в, БЫЛ сервер. У нас был дефект, где объекты, помещаемые в удаленный кэш, перезаписать из-за этого. Это было сенсационным сообщением для меня в той точке, так как я предположил, что хэш-код по умолчанию был адресом памяти объектов также.
Это - то, как я решил его:
Integer.toHexString(System.identityHashCode(object));
Дважды равняется ==
, будет всегда проверять на основе объектных идентификационных данных, независимо от реализации объектов хэш-кода или равняется. Конечно - удостоверяются ссылки на объект, которые Вы сравниваете, volatile
(в 1.5 + JVM).
, Если у Вас действительно должен быть исходный объект toString результат (хотя это не лучшее решение для Вашего примера использования в качестве примера), библиотека Lang палаты общин имеет метод ObjectUtils.identityToString (Объект) , который сделает то, что Вы хотите. От JavaDoc:
public static java.lang.String identityToString(java.lang.Object object)
Получает toString, который был бы произведен Объектом, если бы класс не переопределял сам toString. пустой указатель возвратит пустой указатель.
ObjectUtils.identityToString(null) = null
ObjectUtils.identityToString("") = "java.lang.String@1e23"
ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
Добавьте, что уникальный идентификатор ко всем Вашим экземплярам, т.е.
public interface Idable {
int id();
}
public class IdGenerator {
private static int id = 0;
public static synchronized int generate() { return id++; }
}
public abstract class AbstractSomething implements Idable {
private int id;
public AbstractSomething () {
this.id = IdGenerator.generate();
}
public int id() { return id; }
}
Расширяются от AbstractSomething и запрашивают это свойство. Будет безопасно в единственном vm (принимающий ведение игры с classloaders обойти помехи).