簡體   English   中英

是否可以在 java 中創建多個數據類型的數組如果可能的話,如何?

[英]is it possible to create an array of more than one datatype in java If possible, how?

我想創建一個像列表一樣的數組,就像 java 中的 python3 中的那樣,但我不知道該怎么做 例如:{“John”,1,True,1.7}

是否可以在 java 中創建多個數據類型的數組如果可以,它是如何完成的?

是否可以在 java 中創建多個數據類型的數組?

不,不可能。 但你錯了——在 python 中,這也是不可能的。

訣竅是,在 Python 中,所有對象都只是“對象”,並且您有一個對象列表。 在 java 中,表達式確實有類型。 然而,所有對象都是對象。 所以:

Object[] o = {"John", 1, true, 1.7};

作品。 你真的不想要這個 - arrays 是低級結構。 你會想要List<Object> o = List.of("John", 1, true, 1.7};毫無疑問。

另外,為什么要將其存儲在列表中? 聽起來你想要這個:

class Person {
    String name;
    int id;
    boolean enrolled;
    double gpa;
}

然后是List<Person> 那就是“java 方式”。 Object[]中丟棄這些東西不是java 方式。 在羅馬時,表現得像羅馬人。 編碼 java 時,像 java 那樣寫。 如果您不這樣做,其他任何人都無法閱讀您的代碼,並且庫對您不起作用或感覺怪異和笨拙。 如果您堅持使用“python 風格”編程,那么只需使用 python。

tl;博士

使用 Java 16 及更高版本中的記錄。

record Person ( String name , int talentCode , boolean isAvailable , double grading ) {}

元組

鑒於您的{"John", 1, True, 1.7} ,我懷疑您有一組與單個實體相關的屬性,而不是與兄弟姐妹的集合。 換句話說,你有tuple

Class

如果是這種情況,例如所有四個值都描述一個人,那么在 Java 中,我們將創建一個名為Person的 class 來保存四個成員字段。 每個字段都將是適當的類型。

package work.basil.example.recs;

import java.util.Objects;

public final class Person
{
    private final String name;
    private final int talentCode;
    private final boolean isAvailable;
    private final double grading;

    public Person ( String name , int talentCode , boolean isAvailable , double grading )
    {
        this.name = name;
        this.talentCode = talentCode;
        this.isAvailable = isAvailable;
        this.grading = grading;
    }

    public String name ( ) { return name; }

    public int talentCode ( ) { return talentCode; }

    public boolean isAvailable ( ) { return isAvailable; }

    public double grading ( ) { return grading; }

    @Override
    public boolean equals ( Object obj )
    {
        if ( obj == this ) return true;
        if ( obj == null || obj.getClass() != this.getClass() ) return false;
        var that = ( Person ) obj;
        return Objects.equals( this.name , that.name ) &&
                this.talentCode == that.talentCode &&
                this.isAvailable == that.isAvailable &&
                Double.doubleToLongBits( this.grading ) == Double.doubleToLongBits( that.grading );
    }

    @Override
    public int hashCode ( )
    {
        return Objects.hash( name , talentCode , isAvailable , grading );
    }

    @Override
    public String toString ( )
    {
        return "Person[" +
                "name=" + name + ", " +
                "talentCode=" + talentCode + ", " +
                "isAvailable=" + isAvailable + ", " +
                "grading=" + grading + ']';
    }
}

使用這個 class。

Person alice = new Person( "Alice" , 1 , true , 1.7 ) ;
System.out.println( alice.getName() ) ;

愛麗絲

record

Java 16中編寫這樣的 class 要容易得多,如果這樣的 class 的主要目的是透明且不可變地保存這些數據。

新的記錄功能讓我們可以簡單地定義一個 class,只聲明成員字段。 編譯器隱式創建構造函數、getter、 equals & hashCodetoString

記錄可以被認為是名義元組,引用 JEP 395。“名義”表示每個值都被命名,“元組”表示值的有限有序序列。

public record Person ( String name , int talentCode , boolean isAvailable , double grading )
{
}

使用此記錄。

Person alice = new Person( "Alice" , 1 , true , 1.7 ) ;
System.out.println( alice.name() ) ;

愛麗絲

記錄可以寫為單獨的 class,嵌套在另一個 class 中,甚至可以在方法中本地定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM