Java: загальні статичні багатомірні масиви

Якщо це можливо, як я можу створити багатомірний масив статичного в Java з різними примітивними типами даних для кожного параметра?

За статичним, я маю на увазі примитивний масив, який не є динамічним, як ArrayList.

1
@ BheshGurung Так, я зрозумів це. Це було досить очевидно. ;)
додано Автор Alerty, джерело
Object [] arr = {new Integer [] {}, new String [] {}, new Double [] {}};
додано Автор Bhesh Gurung, джерело
Так, я бачив, що я вводив надто повільно.
додано Автор Bhesh Gurung, джерело

5 Відповіді

Ви не можете.

Багатомірний масив, за визначенням, масив масивів масивів .... щось. Таким чином, немає жодного способу для будь-якого з цих вимірів, крім останнього, щось інше, ніж масив. Принаймні, за традиційним визначенням у будь-якому випадку. Але якщо ви маєте на увазі щось інше за допомогою "багатовимірного масиву", вам потрібно буде сказати нам, що це таке.

Що стосується "статичного", то це значно перевантажені слова в програмуванні, і кожна мова, яку я можу думати, використовує це, щоб означати щось дещо інше. У Java, static означає "належить до класу, а не до екземплярів цього класу". Знову ж таки, якщо ви маєте на увазі щось інше, "статичне" тут, вам потрібно буде сказати нам, що це таке.

Edit: As originally posted, the question didn't include the word "primitive". That changes it a bit. Indeed, I agree that it would be nice from a convenience standpoint if Java allowed arrays to be indexed by char or even an enum rather than just int. But it doesn't.

2
додано
Статичним я маю на увазі масив, який не є динамічним, як ArrayList. Я додати, що в моєму питанні.
додано Автор Alerty, джерело
Вибачте, що не містить слова "примітив".
додано Автор Alerty, джерело
За primitive і static він означає нічого, крім незмінного за розміром , я думаю.
додано Автор user unknown, джерело

Після деяких випробувань у мене є просте рішення:

Object [][] array = new Object [10][2];
array[0][0] = 2;
array[0][1] = false;
1
додано
Поєднання різних типів в масиві - це погана практика, і його слід уникати. Вам потрібно знати, який елемент в масиві якогось типу, якийсь, який компілятор не може гарантувати, це обходить систему типу, що вимагає неприємностей, і вам слід використати додаткову техніку запам'ятовування типів/позиції. У позиційному масиві [1] [0], чи будете ви знову мати int, а в (1,1) логічне?
додано Автор user unknown, джерело
Що було б найкращим способом отримати значення з такого масиву? У C# це Convert.ToInt32 і т.д., не впевнені про java
додано Автор alexey, джерело

Розміри в масиві завжди від типу int. Подумай над цим!

int a = 4;
int b = 5;

Shoe shoe = new Shoe (Color.RED, 42, "Leather");
Hat hat = new Hat (17, Color.Black);

Foo foo = foos[a][b];
Zilch pop = bars[shoe][hat];//no go

Якщо у вас є багатовимірний масив Foos, першим параметром є Foo, другий - масив Foos, третій - масив масиву Foo. Єдиним типом змінної є те, що внизу.

Редагувати після оновлення питання:

Масиви не називаються статичними або примітивними. Їх розмір фіксується при ініціалізації, і те, що вони мають спільне з примітивів, полягає в тому, що вони є будівельними, які в деяких випадках загрожують особливими. Вони - на відміну від так званих примітивних типів, які не є такими примітивними (вони мають, наприклад, оператори, виключно для своїх, наприклад, */- ), але тим часом, вони є об'єктами але не оголошено в бібліотеці.

Назвати їх build in-types .

Використання трюку Бхес Гурунга:

Object[] arr = {new Integer[]{}, new String[]{}, new Double[]{}}; 

просить неприємностей і не складається з різних типів даних для кожного параметра. Почнемо з розмірів:

// One-dimensional object:
JPanel [] panels = new JPanel [3]; 
// Two-dimensional object:
JPanel [][] panels = new JPanel [3][10]; 

У вас є JPanels на нижньому рівні, а масив JPanel у наступному вимірі. Ви можете додати більше параметрів, і завжди будете отримувати додаткові (масив ...) обернути навколо.

Ви не можете змішувати різні типи даних в масиві, як int і char, JPanel і JFrame, або int і JButton. Тільки якщо ви абстрагуєте різницю і використовуєте JComponent для JPanel і JFrame як звичайний батько, але це не буде працювати для вбудованих типів int, char, логічного тощо, тому що вони не є об'єктами.

Але чи не можете ви використовувати autoboxing і використовувати цілі, замість int, Character, а не char, а потім використовувати Object як звичайний батьківський клас? Так, ви могли, але тоді ви більше не використовуєте примітиви, і ви просите неприємностей.

Дан говорить про інше - використання різних типів для індексації в багатовимірному масиві:

byte  b = 120;
short s = 1000;
String o [][] = new String[b][s];
b = 7;
s = 9;  
o[b][s] = "foobar";
String foo = o[b][s];

Немає проблем із використанням байтів або шортів, але ви не можете обмежити розмір масиву, оголосивши його байтом або коротким. У більшості випадків межі вбудованого цілого типу не підходять для типу даних (думаю, 365 днів на рік), особливо, оскільки всі типи можуть бути негативними, тому перевірка обмежень необхідна, хоча і не може бути обмежена для компіляції час

Але тепер до біди:
Ми могли оголосити масив як двовимірні від початку:

Object[][] ar2 = {
    new Integer [] {4, 5, 6}, 
    new String [] {"me", "and", "you"}, 
    new Character [] {'x', 'y', 'z'}};

Це добре працює, і робить внутрішні масиви доступними відразу ж без відтворення. Але для компілятора відома лише те, що елементи є матрицями об'єктів - основний тип абстрагований, і тому ми можемо написати:

ar2[1][1] = 17;//expected: String
ar2[2][0] = "double you";//expected: Char

Це буде компілюватися бездоганно, але ви стріляєте себе в ногу і отримуєте виняток Runtime безкоштовно.

Ось джерело в цілому:

public class ArrOfMixedArr
{
    public static void main (String args[])
    {
        Object[] arr = {
            new Integer [] {1, 2, 3}, 
            new String [] {"you", "and", "me"}, 
            new Character [] {'a', 'b', 'c'}};
        show (arr);

        byte b = 7;
        short s = 9;
        String o [][] = new String[200][1000];
        o[b][s] = "foobar";
        String foo = o[b][s];

        Object[][] ar2 = {
            new Integer [] {4, 5, 6}, 
            new String [] {"me", "and", "you"}, 
            new Character [] {'x', 'y', 'z'}};
        show (ar2);

       //exeptions:
        ar2[1][1] = 17;//expected: String
        ar2[2][0] = "double you";//expected: Char
    }

    public static void show (Object[] arr)
    {
        for (Object o : arr) 
        {
            if (o instanceof Object[])
                show ((Object[]) o);
            else 
                System.out.print (o.toString() + "\t");
        }
        System.out.println ();
    }
}

Яке рішення зараз? Якщо ваші масиви базових типів (int, байт, char, String, JPanel, ...) мають однакову довжину, то у вас є щось схоже на прихований об'єкт, рядок бази даних. Замість цього використовуйте клас:

class Shoe {
    byte size;
    String manufactor;
    java.math.BigDecimal price;
    java.awt.Color color;
}

Shoe [] shoes = new Shoe [7];

Якщо у вас немає різних типів одного розміру, вони можуть бути незв'язаними, і їх не слід розміщувати в загальному контейнері.

1
додано

Ну, ви можете визначити масив масиву ... масиву об'єктів (вкладені з такими ж рівнями, як розміри), а на нижньому рівні заповнити кожен масив іншого типу ... і тоді, коли потрібно витягти значення, віддайте його відповідному типу. Занадто багато роботи за те, що варто, дійсно. Java не є корисним для такого роду речей, будучи статично набраною мовою.

Може бути, ви повинні переглянути, чому б вам потрібна така структура даних.

0
додано

Ви можете отримати ефект за допомогою масиву об'єктів:

final static Object tryit[][] = {
        {'a',4},
        {'b',7},
        {'c',8},
};
@Test
public void accessArray( ) {
    for (int i = 0; i < tryit.length ; i++) {
        char letter = (Character)tryit[i][0];
        int value = (Integer)tryit[i][1];
        System.out.println(letter + " has value " + value);
    }
}

"@Test" - це JUnit анотація.

Зверніть увагу, що цей підхід підлягає виняткам NullPointer та ClassCast під час виконання, якщо в масив введені неправильні дані.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників