Java-новичок: что предпочтительнее, когда в классе есть Arraylist of Arraylist (clone (), неизменяемый список, пользовательское глубокое копирование) - PullRequest
1 голос
/ 08 декабря 2010

У меня есть класс Matrix, который содержит ArrayList<ArrayList<Double>> matrix; внутри, и я хочу знать, какой вариант предпочтительнее, когда я хочу скопировать экземпляры этого класса.

  1. Должен ли я реализовать клон
  2. Использовать неизменяемый список СОВЕТ Я не знаю, как это сделать в ArrayList
  3. Делать на заказ copyEntries(){return Matrix(this); и конструктор копирования (Matrix other)

P.S

  1. Я гибок, если бы была лучшая рекомендация типа, такая как вектор вектора
  2. если List<List<Double>>, а затем новый ArrayList<Double> это лучше?
  3. Я использовал Apache Commons и некоторые другие библиотеки, но в конце я обнаружил, что это должен быть пользовательский класс матрицы.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Если вы пытаетесь скопировать матрицу, имейте в виду, Double невозможно изменить, поэтому нет смысла создавать новые экземпляры.Вы можете свободно копировать ссылки, используя что-то вроде:

List> copy = new ArrayList> ();copy.addAll (оригинал);

Затем вы можете изменить любой из элементов, и оригинал не будет изменен:

copy.get( 0 ) .get( 0 ) = -1.0; 

// original at ( 0,0 ) remains the same ... 

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

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public class CopyMatrix { 
    public static void main( String [] args ) { 

        Matrix m = new Matrix();
        m.add( Arrays.asList(0.0, 1.0, 2.0 ));
        m.add( Arrays.asList(3.0, 4.0, 5.0 ));
        m.add( Arrays.asList(6.0, 7.0, 8.0 ));

        System.out.println("m = \n" +  m );

        Matrix m1 = m.copy() ;

        m1.get( 0 ).set( 0 , 100.0 );
        m1.get( 2 ).set( 2 , -400.0 );


        System.out.printf( "After m = %n %s %n m1 = %n %s %n", m, m1);
    }
}
class Matrix extends ArrayList<List<Double>> {
    public Matrix copy() {
        Matrix copy = new Matrix();
        for( List<Double> each : this ) { 
            copy.add( new ArrayList<Double>( each ) );
        }
        return copy;
    }
}

Вывод:

 java CopyMatrix 
m = 
[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]
After m = 
 [[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]] 
 m1 = 
 [[100.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, -400.0]] 

Это работает !!

1 голос
/ 08 декабря 2010

Я бы, вероятно, использовал

class Matrix implements Cloneable {

Затем в методе клонирования:

matrix = new ArrayList<ArrayList<Double>>(other.matrix.size());
for(ArrayList<Double> vector:other.matrix){
    matrix.add(vector.clone());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...