2012-02-10 118 views
0

我正在從C++轉換爲Java。 有誰知道如何將其轉換爲Java?在一行中初始化Java數組

typedef struct { 
     int id;     
     char *old_end;   
     char *new_end;   
     int old_offset;  
     int new_offset;  
     int min_root_size;  
    int func;   
     } RuleList; 

static RuleList step1a_rules[] = 
     { 
     101, "sses",  "ss", 3, 1, -1, _NULL, 
     102, "ies",  "i",  2, 0, -1, _NULL, 
     103, "ss",  "ss", 1, 1, -1, _NULL, 
     104, "s",   _LAMBDA, 0, -1, -1, _NULL, 
     000, NULL,  NULL, 0, 0, 0, _NULL, 
     }; 

感謝

+2

*「in one line」*當源代碼的主要目的是人類可讀時,這是一個非常強制的限制。順便說一句 - 請不要忘記在問題中增加一個問號,並且它會支付一些(或任何)努力來解決問題。 – 2012-02-10 03:52:36

+0

如果數組的類型是RuleList,那麼無論如何,您必須使用RuleList對象初始化它。你不能只在定義中放置文字。您還需要創建一個Java類來反映您的結構。 – 2012-02-10 03:54:01

+0

你在這裏錯過了一大串大括號;確切地說,每一行都是如此。 – Xeo 2012-02-10 04:00:52

回答

1

你需要一個構造RuleList

class RuleList { 
    int id;     
    String old_end;   
    String new_end;   
    int old_offset;  
    int new_offset;  
    int min_root_size;  
    int func; 

    RuleList(int id, String old_end, String new_end, int old_offset, 
     int new_offset, int min_root_size, int func) 
    { 
     this.id = id; 
     this.old_end = old_end; 
     // etc. 
    } 
}; 

static RuleList[] step1a_rules = { 
    new RuleList(101, "sses",  "ss", 3, 1, -1, _NULL), 
    new RuleList(102, "ies",  "i",  2, 0, -1, _NULL), 
    new RuleList(103, "ss",  "ss", 1, 1, -1, _NULL), 
    new RuleList(104, "s",   _LAMBDA, 0, -1, -1, _NULL), 
    new RuleList(000, null,  null, 0, 0, 0, _NULL), 
}; 

這假定_NULL是一個定義的靜態int值和_LAMBDA是一個定義的靜態String值。

+1

我不會在Java中的變量名中使用下劃線。 另外,下面這行不會編譯,因爲你缺少「新RuleList []」: static RuleList [] step1a_rules = { – 2012-02-10 04:05:29

+0

我其實認爲在最近的Java版本中,你可以省略'new RuleList []' '{'...?或者,也許這隻適用於例如整數。 – 2012-02-10 04:26:43

+0

@Ben - 我只是重複使用OP的變量名稱。我同意他們不是通常的Java風格(儘管他們在語言中是合法的)。最後一條語句是完全合法的:它是一個不需要'new RuleList []'的數組初始值設定項。 (請參見[Java語言規範,第10.6節](http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.6))。 – 2012-02-10 04:32:00

1

在Java中執行此操作的標準方式如下。 Java中的RuleList類比RuleList C結構更加冗長,但是有很多簡單的方法可以處理,比如使用Eclipse生成大部分代碼。

public class RuleList { 
    private final int id;     
    private final String oldEnd;   
    private final String newEnd;   
    private final int oldOffset;  
    private final int newOffset;  
    private final int minRootDize;  
    private final int func; 

    public RuleList(int id, String oldEnd, String newEnd, int oldOffset, 
     int newOffset, int minRootDize, int func) { 
    this.id = id; 
    this.oldEnd = oldEnd; 
    this.newEnd = newEnd; 
    this.oldOffset = oldOffset; 
    this.newOffset = newOffset; 
    this.minRootDize = minRootDize; 
    this.func = func; 
    } 

    public int getId() { 
    return id; 
    } 
    public String getOldEnd() { 
    return oldEnd; 
    } 
    public String getNewEnd() { 
    return newEnd; 
    } 
    public int getOldOffset() { 
    return oldOffset; 
    } 
    public int getNewOffset() { 
    return newOffset; 
    } 
    public int getMinRootDize() { 
    return minRootDize; 
    } 
    public int getFunc() { 
    return func; 
    } 
} 

RuleList[] step1aRules = new RuleList[] { 
    new RuleList(101, "sses",  "ss", 3, 1, -1, 0), 
    new RuleList(102, "ies",  "i",  2, 0, -1, 0), 
    new RuleList(103, "ss",  "ss", 1, 1, -1, 0), 
    new RuleList(104, "s",   _LAMBDA, 0, -1, -1, 0), 
    new RuleList(000, null,  null, 0, 0, 0, 0), 
}; 
+2

你能告訴我你爲什麼使用final作爲變量嗎?這意味着它是否與上面的C++代碼相關?謝謝。 – hqt 2012-02-10 04:13:53

+1

這意味着你不打算在構造你的RuleList之後改變變量的值。如果你想能夠改變這個值,那麼你應該刪除最後的並添加一個setter,如下所示:public void setId(int id){this。id = id; } – 2012-02-10 04:20:21

+1

的'新RuleList []'是在最後聲明中不必要的。另外,由於成員變量被聲明爲「final」,所以可以公開它們並免除訪問函數。 – 2012-02-10 04:33:25

0

您可以創建一個類RuleList,在這之後創建這個類的一個數組:

public class RuleList{ 
    int id ;   
    char old_end; //note that java does not use (* for pointer like C++)  
    char new_end;   
    int old_offset;  
} 

static RuleList[] step1a_rules = new RuleList[]{ 
        new RuleList (101,"sses","ss",3, 1,-1, 0),... }; 

在上面的代碼中,你將看到不同的東西,從C++,因爲與Java,幾乎一切都是對象。所以你聲明step1a_rules是一個包含其他對象的數組(Rulelist)。所以,這個類的每個對象,都必須使用關鍵字new來實例化新對象。我幾乎忘記了:你應該注意到,java和C++有一些不同:在C++類中,默認成員是私有的。而在Java類中,默認成員是公共的。當然,上面的代碼沒有問題,因爲struct的默認成員也是公共的:D

+0

在Java類中,默認訪問是_package private_:只能在同一個包中定義的代碼中訪問,而且最後一條語句中不需要'new RuleList []'你是否嘗試過?你需要顯式聲明接受參數的'RuleList'構造函數。 – 2012-02-10 04:34:30