/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package hivemall.utils.collections; import java.io.Serializable; public final class DoubleArrayList implements Serializable { private static final long serialVersionUID = -8155789759545975413L; public static final int DEFAULT_CAPACITY = 12; /** array entity */ private double[] data; private int used; public DoubleArrayList() { this(DEFAULT_CAPACITY); } public DoubleArrayList(int size) { this.data = new double[size]; this.used = 0; } public DoubleArrayList(double[] initValues) { this.data = initValues; this.used = initValues.length; } public void add(double value) { if (used >= data.length) { expand(used + 1); } data[used++] = value; } public void add(double[] values) { final int needs = used + values.length; if (needs >= data.length) { expand(needs); } System.arraycopy(values, 0, data, used, values.length); this.used = needs; } /** * dynamic expansion. */ private void expand(int max) { while (data.length < max) { final int len = data.length; double[] newArray = new double[len * 2]; System.arraycopy(data, 0, newArray, 0, len); this.data = newArray; } } public double remove() { return data[--used]; } public double remove(int index) { final double ret; if (index > used) { throw new IndexOutOfBoundsException(); } else if (index == used) { ret = data[--used]; } else { // index < used // removed value ret = data[index]; final double[] newarray = new double[--used]; // prefix System.arraycopy(data, 0, newarray, 0, index - 1); // appendix System.arraycopy(data, index + 1, newarray, index, used - index); // set fields. this.data = newarray; } return ret; } public void set(int index, double value) { if (index > used) { throw new IllegalArgumentException("Index MUST be less than \"size()\"."); } else if (index == used) { ++used; } data[index] = value; } public double get(int index) { if (index >= used) throw new IndexOutOfBoundsException(); return data[index]; } public double fastGet(int index) { return data[index]; } public int size() { return used; } public boolean isEmpty() { return used == 0; } public void clear() { used = 0; } public double[] toArray() { final double[] newArray = new double[used]; System.arraycopy(data, 0, newArray, 0, used); return newArray; } public double[] array() { return data; } @Override public String toString() { final StringBuilder buf = new StringBuilder(); buf.append('['); for (int i = 0; i < used; i++) { if (i != 0) { buf.append(", "); } buf.append(data[i]); } buf.append(']'); return buf.toString(); } }