/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed 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 org.deidentifier.arx.framework.data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.deidentifier.arx.RowSet;
/**
* Encodes a data object consisting of a dictionary encoded two-dimensional
* array, an associated dictionary, a header and a mapping to the columns in the
* input data set.
*
* @author Fabian Prasser
* @author Florian Kohlmayer
*/
public class Data implements Cloneable{
/** The outliers mask. */
public static final int OUTLIER_MASK = 1 << 31;
/** The inverse outliers mask. */
public static final int REMOVE_OUTLIER_MASK = ~OUTLIER_MASK;
/** Row, Dimension. */
private final int[][] data;
/** The header. */
private final String[] header;
/** The associated dictionary. */
private final Dictionary dictionary;
/** The associated map. */
private final int[] map;
/**
* Creates a new data object.
*
* @param data
* The int array
* @param header
* The header
* @param map
* The map
* @param dictionary
* The dictionary
*/
public Data(final int[][] data,
final String[] header,
final int[] map,
final Dictionary dictionary) {
this.data = data;
this.header = header;
this.dictionary = dictionary;
this.map = map;
}
@Override
public Data clone(){
int[][] newData = new int[data.length][];
for (int i=0; i < data.length; i++){
newData[i] = Arrays.copyOf(data[i], header.length);
}
return new Data(newData, header, map, dictionary);
}
/**
* Returns the data array.
*
* @return
*/
public int[][] getArray() {
return data;
}
/**
* Returns the data.
*
* @return
*/
public int[][] getData() {
return data;
}
/**
* Returns the number of rows.
*
* @return the data length
*/
public int getDataLength() {
return data.length;
}
/**
* Returns the dictionary.
*
* @return
*/
public Dictionary getDictionary() {
return dictionary;
}
/**
* Returns the header.
*
* @return
*/
public String[] getHeader() {
return header;
}
/**
* Returns the map.
*
* @return
*/
public int[] getMap() {
return map;
}
/**
* Returns a new instance that is projected onto the given subset
* @param rowset
* @return
*/
public Data getSubsetInstance(RowSet rowset) {
int[][] array = null;
if (this.data != null) {
List<int[]> newdata = new ArrayList<int[]>();
for (int row = 0; row < this.data.length; row++) {
if (rowset.contains(row)) {
newdata.add(data[row]);
}
}
array = new int[newdata.size()][];
for (int i = 0; i < newdata.size(); i++) {
array[i] = newdata.get(i);
}
}
return new Data(array, header, map, dictionary);
}
}