public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Поскольку как 1, так и 3 являются ints, результат не округлен, но он усечен. Таким образом, вы игнорируете фракции и выполняете только целые.
Чтобы избежать этого, по крайней мере одно из ваших чисел 1 или 3 как десятичная форма 1.0 и / или 3.0.
Я согласился бы с Вашим подходом переопределить hashCode()
и equals()
и использовать что-то, что реализует Set
.
Выполнение так также делает это абсолютно ясным любым другим разработчикам, что недублирующаяся характеристика требуется.
Другая причина - Вы добираетесь для выбора реализации, которая удовлетворяет потребности лучше всего теперь:
и Вы не должны изменять Ваш код для изменения реализации в будущем.
Я нашел, что это в сети
Вот является двумя методами, которые позволяют, Вы для удаления дубликатов в ArrayList. removeDuplicate не поддерживаете порядок, где, поскольку removeDuplicateWithOrder поддерживает порядок с некоторой производительностью наверху.
removeDuplicate Метод:
/** List order not maintained **/
public static void removeDuplicate(ArrayList arlList)
{
HashSet h = new HashSet(arlList);
arlList.clear();
arlList.addAll(h);
}
removeDuplicateWithOrder Метод:
/** List order maintained **/
public static void removeDuplicateWithOrder(ArrayList arlList)
{
Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = arlList.iterator(); iter.hasNext();) {
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
arlList.clear();
arlList.addAll(newList);
}
Я хотел бы повторить мнение, высказанное Jason в комментариях:
, Почему место самостоятельно в той точке вообще?
, Почему использование массив для структуры данных, которая не должна содержать дубликаты вообще?
Использование Set
или SortedSet
(когда элементы имеют естественный порядок также) в любом случае для содержания элементов. Если необходимо сохранить порядок вставки, то можно использовать LinkedHashSet
, как на него указали.
Необходимость выполнить последующую обработку некоторую структуру данных часто является подсказкой, что необходимо было выбрать другой для начала.
В основном Вы хотите LinkedHashSet<T>
реализация, которая поддерживает эти List<T>
интерфейс для произвольного доступа. Следовательно, это - то, в чем Вы нуждаетесь:
public class LinkedHashSetList<T> extends LinkedHashSet<T> implements List<T> {
// Implementations for List<T> methods here
...
}
реализация эти List<T>
методы получили бы доступ и управляли бы лежанием в основе LinkedHashSet<T>
. Прием должен иметь этот класс, ведут себя правильно, когда каждый пытается добавить, что дубликаты через эти List<T>
добавляют методы (выдающий исключение или повторно добавляющий, что объект в другом индексе был бы опциями: из которого можно или выбрать один из или сделать настраивающимся пользователями класса).
Переопределение equals
и hashCode
и создание набора было моей первой мыслью также. Это - хорошая практика, чтобы иметь некоторую переопределенную версию этих методов так или иначе в Вашей иерархии наследования.
я думаю , что, если Вы используете LinkedHashSet
, Вы даже сохраните порядок уникальных элементов...
Конечно, исходное сообщение вызывает вопрос, "Как Вы получали тот массив (который мог бы содержать дублированные записи), во-первых?"
Вам нужен массив (с дубликатами) для других целей, или Вы могли просто использовать Набор с начала?
Поочередно, если необходимо знать количество случаев каждого значения, Вы могли бы использовать Map<CustomObject, Integer>
для отслеживания количеств. Кроме того, определение Google Collections Мультиклассов сопоставления может быть полезным.
Set
определенно Ваш лучший выбор. Единственный способ удалить вещи из массива (не создавая новый) состоит в том, чтобы аннулировать их, и затем Вы заканчиваете с большим количеством пустых проверок позже.
Разговор из общего стандарта программирования, который Вы могли всегда удваивать, перечисляет наборы затем сравнивание источника и цели.
И если Ваше внутреннее перечисление всегда запускает одну запись после источника, довольно эффективно (псевдо код следовать)
foreach ( array as source )
{
// keep track where we are in the array
place++;
// loop the array starting at the entry AFTER the current one we are comparing to
for ( i=place+1; i < max(array); i++ )
{
if ( source === array[place] )
{
destroy(array[i]);
}
}
}
, Вы могли возможно добавить повреждение; оператор после уничтожения, но затем Вы только обнаруживаете первый дубликат, но если бы это - все, что Вы будете когда-либо иметь, затем это была бы хорошая маленькая оптимизация.