📄 treeindex.java
字号:
package prefuse.data.util;
import java.util.Comparator;
import prefuse.data.Table;
import prefuse.data.column.Column;
import prefuse.data.event.ColumnListener;
import prefuse.data.event.EventConstants;
import prefuse.data.event.TableListener;
import prefuse.util.collections.BooleanIntSortedMap;
import prefuse.util.collections.DoubleIntSortedMap;
import prefuse.util.collections.FloatIntSortedMap;
import prefuse.util.collections.IncompatibleComparatorException;
import prefuse.util.collections.IntIntSortedMap;
import prefuse.util.collections.IntIterator;
import prefuse.util.collections.IntSortedMap;
import prefuse.util.collections.LongIntSortedMap;
import prefuse.util.collections.ObjectIntSortedMap;
import prefuse.util.collections.SortedMapFactory;
/**
* Index instance that uses red-black trees to provide an index
* over a column of data.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class TreeIndex implements Index, ColumnListener, TableListener {
protected Table m_table;
protected RowManager m_rows;
protected Column m_col;
protected IntSortedMap m_index;
protected boolean m_reindex;
protected int m_colidx;
/**
* Create a new TreeIndex.
* @param t the Table containing the data column to index
* @param rows the RowManager of the Table
* @param col the Column instance to index
* @param cmp the Comparator to use to sort data values
* @throws IncompatibleComparatorException if the comparator is not
* compatible with the column's data type
*/
public TreeIndex(Table t, RowManager rows, Column col, Comparator cmp)
throws IncompatibleComparatorException
{
m_table = t;
m_rows = rows;
m_col = col;
m_index = SortedMapFactory.getMap(col.getColumnType(), cmp, false);
index();
m_col.addColumnListener(this);
m_table.addTableListener(this);
}
/**
* @see prefuse.data.util.Index#dispose()
*/
public void dispose() {
m_col.removeColumnListener(this);
m_table.removeTableListener(this);
}
/**
* @see prefuse.data.util.Index#getComparator()
*/
public Comparator getComparator() {
return m_index.comparator();
}
/**
* @see prefuse.data.util.Index#size()
*/
public int size() {
return m_index.size();
}
private int getColumnIndex() {
if ( !(m_table.getColumn(m_colidx) == m_col) ) {
m_colidx = m_table.getColumnNumber(m_col);
}
return m_colidx;
}
// ------------------------------------------------------------------------
// Index Update Methods
/**
* @see prefuse.data.util.Index#index()
*/
public void index() {
m_index.clear();
// iterate over all valid values, adding them to the index
int idx = getColumnIndex();
m_colidx = idx;
IntIterator rows = m_rows.rows();
if ( m_index instanceof IntIntSortedMap )
{
IntIntSortedMap map = (IntIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.getInt(m_table.getColumnRow(r,idx)), r);
}
}
else if ( m_index instanceof LongIntSortedMap )
{
LongIntSortedMap map = (LongIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.getLong(m_table.getColumnRow(r,idx)), r);
}
}
else if ( m_index instanceof FloatIntSortedMap )
{
FloatIntSortedMap map = (FloatIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.getFloat(m_table.getColumnRow(r,idx)), r);
}
}
else if ( m_index instanceof DoubleIntSortedMap )
{
DoubleIntSortedMap map = (DoubleIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.getDouble(m_table.getColumnRow(r,idx)), r);
}
}
else if ( m_index instanceof BooleanIntSortedMap )
{
BooleanIntSortedMap map = (BooleanIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.getBoolean(m_table.getColumnRow(r,idx)), r);
}
}
else if ( m_index instanceof ObjectIntSortedMap )
{
ObjectIntSortedMap map = (ObjectIntSortedMap)m_index;
while ( rows.hasNext() ) {
int r = rows.nextInt();
map.put(m_col.get(m_table.getColumnRow(r,idx)), r);
}
}
else {
throw new IllegalStateException();
}
m_reindex = false;
}
// ------------------------------------------------------------------------
// Listener Methods
/**
* @see prefuse.data.event.TableListener#tableChanged(prefuse.data.Table, int, int, int, int)
*/
public void tableChanged(Table t, int start, int end, int col, int type) {
if ( type == EventConstants.UPDATE || t != m_table
|| col != EventConstants.ALL_COLUMNS )
return;
boolean insert = (type==EventConstants.INSERT);
for ( int r=start; r<=end; ++r )
rowChanged(r, insert);
}
private void rowChanged(int row, boolean insert) {
// make sure we access the right column value
int crow = m_rows.getColumnRow(row, getColumnIndex());
if ( m_index instanceof IntIntSortedMap )
{
IntIntSortedMap map = (IntIntSortedMap)m_index;
int key = m_col.getInt(row);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else if ( m_index instanceof LongIntSortedMap )
{
LongIntSortedMap map = (LongIntSortedMap)m_index;
long key = m_col.getLong(crow);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else if ( m_index instanceof FloatIntSortedMap )
{
FloatIntSortedMap map = (FloatIntSortedMap)m_index;
float key = m_col.getFloat(crow);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else if ( m_index instanceof DoubleIntSortedMap )
{
DoubleIntSortedMap map = (DoubleIntSortedMap)m_index;
double key = m_col.getDouble(crow);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else if ( m_index instanceof BooleanIntSortedMap )
{
BooleanIntSortedMap map = (BooleanIntSortedMap)m_index;
boolean key = m_col.getBoolean(crow);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else if ( m_index instanceof ObjectIntSortedMap )
{
ObjectIntSortedMap map = (ObjectIntSortedMap)m_index;
Object key = m_col.get(crow);
if ( insert )
map.put(key, row);
else
map.remove(key, row);
}
else {
throw new IllegalStateException();
}
}
/**
* @see prefuse.data.event.ColumnListener#columnChanged(prefuse.data.column.Column, int, int, int)
*/
public void columnChanged(Column src, int type, int start, int end) {
m_reindex = true;
}
/**
* @see prefuse.data.event.ColumnListener#columnChanged(prefuse.data.column.Column, int, boolean)
*/
public void columnChanged(Column src, int idx, boolean prev) {
int row = m_rows.getTableRow(idx, getColumnIndex());
if ( row < 0 ) return; // invalid row value
((BooleanIntSortedMap)m_index).remove(prev, row);
((BooleanIntSortedMap)m_index).put(src.getBoolean(idx), row);
}
/**
* @see prefuse.data.event.ColumnListener#columnChanged(prefuse.data.column.Column, int, int)
*/
public void columnChanged(Column src, int idx, int prev) {
int row = m_rows.getTableRow(idx, getColumnIndex());
if ( row < 0 ) return; // invalid row value
((IntIntSortedMap)m_index).remove(prev, row);
((IntIntSortedMap)m_index).put(src.getInt(idx), row);
}
/**
* @see prefuse.data.event.ColumnListener#columnChanged(prefuse.data.column.Column, int, long)
*/
public void columnChanged(Column src, int idx, long prev) {
int row = m_rows.getTableRow(idx, getColumnIndex());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -