001    /*
002     * Copyright (C) 2008-2010 by Holger Arndt
003     *
004     * This file is part of the Universal Java Matrix Package (UJMP).
005     * See the NOTICE file distributed with this work for additional
006     * information regarding copyright ownership and licensing.
007     *
008     * UJMP is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU Lesser General Public License as
010     * published by the Free Software Foundation; either version 2
011     * of the License, or (at your option) any later version.
012     *
013     * UJMP is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016     * GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public
019     * License along with UJMP; if not, write to the
020     * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
021     * Boston, MA  02110-1301  USA
022     */
023    
024    package org.ujmp.core.objectmatrix.calculation;
025    
026    import java.util.Collection;
027    import java.util.List;
028    
029    import org.ujmp.core.Matrix;
030    import org.ujmp.core.exceptions.MatrixException;
031    import org.ujmp.core.util.MathUtil;
032    import org.ujmp.core.util.StringUtil;
033    
034    public class Deletion extends AbstractObjectCalculation {
035            private static final long serialVersionUID = 3714270132906708701L;
036    
037            private long[][] selection = null;
038    
039            public Deletion(Matrix m, String deletionString) {
040                    this(m, StringUtil.parseSelection(deletionString, m.getSize()));
041            }
042    
043            public Deletion(Matrix m, Collection<? extends Number>... deletion) {
044                    super(m);
045    
046                    List<Long> rows = MathUtil.sequenceListLong(0, getSource().getRowCount() - 1);
047                    List<Long> columns = MathUtil.sequenceListLong(0, getSource().getColumnCount() - 1);
048    
049                    for (Number n : deletion[ROW]) {
050                            rows.remove(n.longValue());
051                    }
052    
053                    for (Number n : deletion[COLUMN]) {
054                            columns.remove(n.longValue());
055                    }
056    
057                    selection = new long[2][];
058                    selection[ROW] = MathUtil.collectionToLong(rows);
059                    selection[COLUMN] = MathUtil.collectionToLong(columns);
060            }
061    
062            public Deletion(Matrix m, long[]... deletion) {
063                    super(m);
064    
065                    List<Long> rows = MathUtil.sequenceListLong(0, getSource().getRowCount() - 1);
066                    List<Long> columns = MathUtil.sequenceListLong(0, getSource().getColumnCount() - 1);
067    
068                    if (deletion != null && deletion[ROW] != null) {
069                            for (int r = 0; r < deletion[ROW].length; r++) {
070                                    rows.remove(deletion[ROW][r]);
071                            }
072                    }
073    
074                    if (deletion.length > 1 && deletion[COLUMN] != null) {
075                            for (int c = 0; c < deletion[COLUMN].length; c++) {
076                                    columns.remove(deletion[COLUMN][c]);
077                            }
078                    }
079    
080                    selection = new long[2][];
081                    selection[ROW] = MathUtil.collectionToLong(rows);
082                    selection[COLUMN] = MathUtil.collectionToLong(columns);
083            }
084    
085            public Object getObject(long... coordinates) throws MatrixException {
086                    return getSource().getAsObject(selection[ROW][(int) coordinates[ROW]],
087                                    selection[COLUMN][(int) coordinates[COLUMN]]);
088            }
089    
090            public long[] getSize() {
091                    return new long[] { selection[ROW].length, selection[COLUMN].length };
092            }
093    
094    }