Таблица как структура данных Java

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

25
задан Brian Tompsett - 汤莱恩 8 November 2015 в 22:54
поделиться

7 ответов

Существует универсальный класс TreeBasedTable из библиотеки Google , который делает именно то, что вы просите. Он также предлагает множество других полезных служебных методов, и его использование показано в руководстве пользователя .

Из TreeBasedTable документов:

Реализация таблицы, чьи ключи строк и ключи столбцов упорядочены по их естественному упорядочению или предоставленными компараторами.

Пример использования:

RowSortedTable<Vertex, Vertex, Double> weightedGraph = TreeBasedTable.create();
weightedGraph.put(v2, v3, 4.0);
weightedGraph.put(v1, v2, 20.0);

System.out.println( weightedGraph.rowKeySet() ); // prints [v1, v2]
24
ответ дан raks81 8 November 2015 в 22:54
поделиться

Что вы имеете в виду:

я должен иметь возможность сортировать его по параметру sij

Что не так с:

Object [][] data

РЕДАКТИРОВАТЬ

Хорошо, просто предположите, что вам нужно это StrangeDataStructure , которая содержит массив и помогает вам сортировать по первому столбцу, то единственное, что вам нужно, это что-то вроде этого:

class Structure {
    Object [][] data;
    Object [] indexColumn; // the sij?
}

И это все: вам нужно добавить метод сортировки, указывающий направление, и сортировать, используя «indexColumn»

Я думаю, это ОЧЕНЬ просто (и если бы я понял твой «вопрос» )

Знаете что? Я собираюсь осуществить это.

// время истекает ...

Вот оно:

import java.util.Comparator;
import java.util.Arrays;

public class StrangeStructure {

    private Integer [][] data;
    private Integer [] sij; // what is sij anyway?

    public StrangeStructure( Integer [][] matrix  ) {
        data = matrix;
        sij = new Integer[ data.length ];
        for( int i = 0 ; i < data.length ; i++ ) {
            sij[i] = data[i][0];
        }
    }

    public void sort( Direction direction  ) {

        Comparator sijComparator  = new DataComparator( direction, true );
        Comparator dataComparator = new DataComparator( direction, false );

        Arrays.sort( sij, sijComparator );
        Arrays.sort( data, dataComparator  );

    }

    public static void main( String [] args ) {

        StrangeStructure s =  
            new StrangeStructure( new Integer[][]{
                                  { 45, 5, 7 }, 
                                  { 33, 1, 6 }, 
                                  { 31, 0, 9 }, 
                                  { 12, 8, 2 }    
                            });

        System.out.printf("Original:\n%s", s );       

        s.sort( Direction.MIN_TO_MAX );  
        System.out.printf("Min to max:\n%s", s );       

        s.sort( Direction.MAX_TO_MIN );  
        System.out.printf("Max to min\n%s", s );       

    }


    public String toString() {
        StringBuilder b = new StringBuilder();
        for( Integer [] row : data ) {
            for( int i : row ) {
                b.append( i+",");
            }
            b.append("\n");
        }
        return b.toString();

    }

}
class DataComparator implements Comparator {

    private Direction direction;
    private boolean isSij;

    public DataComparator( Direction d, boolean isSij ) {
        this.direction = d;
        this.isSij = isSij;
    }

    public int compare( Object one , Object two  ) {
        if( isSij ){
            return doCompare( direction, (Integer) one, (Integer) two );
        } else {
            return doCompare( direction, ((Integer[])one)[0], ((Integer[])two)[0]);
        }
    }
    public int doCompare( Direction d, int one, int two  ) {
        int a = ( d == Direction.MIN_TO_MAX? one: two );
        int b = ( d == Direction.MIN_TO_MAX? two: one ) ;
        return a - b;
    }
    public boolean equals( Object o ) {
        return false;
    }
}



enum Direction{
    MIN_TO_MAX,
    MAX_TO_MIN
}

Вывод:

Original:
45,5,7,
33,1,6,
31,0,9,
12,8,2,
Min to max:
12,8,2,
31,0,9,
33,1,6,
45,5,7,
Max to min
45,5,7,
33,1,6,
31,0,9,
12,8,2,
17
ответ дан OscarRyz 8 November 2015 в 22:54
поделиться

Один из вариантов - создать новый объект, который содержит 3 переменные, а затем создать массив / дерево этих объектов и отсортировать их по требуемому параметру.

1
ответ дан 8 November 2015 в 22:54
поделиться

Вот один из способов: создать объект с именем Row для хранения каждой строки, а затем создать java.util.HashMap, ключи которого - целочисленные sij, а значения - соответствующие строки.

public class Example
{
  public static class Row
  {
    public Integer sij;
    public Integer i;
    public Integer j;
    public Row(Integer sij, Integer i, Integer j)
    {
      this.sij = sij;
      this.i = i;
      this.j = j;
    }
  }

  public static void main(String[] args)
  {
    Row r1 = new Row(45, 5, 7);
    Row r2 = new Row(33, 1, 6);
    Row r3 = new Row(31, 0, 9);
    Row r4 = new Row(12, 8, 2);
    Map<Integer, Row> map = new TreeMap<Integer, Row>();
    map.put(r1.sij, r1);
    map.put(r2.sij, r2);
    map.put(r3.sij, r3);
    map.put(r4.sij, r4);
    for ( Row row : map.values() ) {
        System.out.println("sij: " + row.sij + " i: " + row.i + " j: " + row.j);
    }
  }
}

Когда это работает, он производит:

sij: 12 i: 8 j: 2
sij: 31 i: 0 j: 9
sij: 33 i: 1 j: 6
sij: 45 i: 5 j: 7
1
ответ дан Jim Ferrans 8 November 2015 в 22:54
поделиться

Если я правильно понимаю ваш вопрос, все, что вам нужно, это класс Comparable для представления строки.

public static class Row
implements Comparable<Row> {
  public Row(int sij, int i, int j) {
    this.sij = sij;
    this.i = i;
    this.j = j;
  }

  public int compareTo(Row other) {
    return Integer.valueOf(sij).compareTo(other.sij);
  }

  public final int sij;
  public final int i;
  public final int j;
}

Затем можно заполнить List экземплярами Row и использовать Collections.sort для его сортировки.

1
ответ дан finnw 8 November 2015 в 22:54
поделиться

Прочтите раздел из учебника Swing на Как использовать таблицы . В руководстве показано, как создать таблицу, а также как добавить в нее возможность сортировки.

Если вам нужно только сохранить данные, но не отображать их, вы можете использовать двумерный массив или список списков . Затем вы можете использовать Column Comparator для сортировки.

Edit: добавлен код, демонстрирующий использование ColumnComparator

import java.util.*;

public class SortSIJ
{
    public static void main(String args[])
    {
        Object[] data = new Object[4];
        data[0] = new Integer[] {45, 5, 7};
        data[1] = new Integer[] {33, 1, 6};
        data[2] = new Integer[] {31, 0, 9};
        data[3] = new Integer[] {12, 8, 2};

        ColumnComparator cc = new ColumnComparator(0);
//      cc.setAscending( false );

        Arrays.sort(data, cc);

        for (Object row: data)
        {
            Integer[] theRow = (Integer[])row;
            System.out.println( Arrays.asList(theRow) );
        }
    }
}

Я также согласен с предложением создать объект для хранения 3 переменных. В этом случае вы можете использовать BeanComparator , который можно найти по указанной выше ссылке.

3
ответ дан 28 November 2019 в 20:49
поделиться

Вы можете использовать MultiValueMap из Apache, чтобы связать несколько значений с один ключ.

2
ответ дан 28 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: