2015-03-04 5 views
1

Я пытаюсь прочитать блок в текстовых простых данных и отделить его в соответствующих атрибутах в структуре.union typedef in java

Вроде как код C/C++ для CLASIC Например:

typedef struct { 
     char yyyy[4], 
     char mm[2], 
     char dd[2] 
} ISO; 

typedef struct { 
     char dd[2], 
     char mm[2], 
     char yyyy[4] 
} JAPAN; 

typedef struct { 
     char mm[2], 
     char dd[2], 
     char yyyy[4] 
} USA; 

typedef union { 
     char date[8], 
     ISO iso_date, 
     JAPAN japan_date, 
     USA usa_date 
} date_format; 

///// 
char date[8] = "20150304"; 
date_format format = (date_format)date; 
printf("%s\n", format->iso_date->yyyy); 

Как представить это в Java или заводной?

+0

Формат даты только пример, реальная проблема заключается разобрать большую строку несколько определенных полей – miguelote

ответ

1

1) Java не имеет структур.

Но вы можете использовать класс как

class ISO { 
    public char yyyy = new char[4]; 
    public char mm = new char[2]; 
    //etc.. 
} 

2) Заменить ассоциации с классом иерархий

abstract class DateFormat { 
    abstract Object getObj(); 
} 

class uISO extends DateFormat { 
    ISO iso = new ISO(); 
    public Object getObj() { return obj; } 
} 

и так далее для других ваших структур.

1

В groovy (как на Java) нет такой конструкции, так как одна из целей дизайна - не допустить, чтобы dev не играл с кусками памяти. Поэтому вам придется придумать какой-либо способ обернуть это в классы/интерфейсы. Вот пример использования заводной trait S:

// just to have the base for the functions 
interface ConcreteDate { 
    String getDateChunk() 
    String getDay() 
    String getMonth() 
    String getYear() 
} 

// actual implementation for ISO 
trait ISODate implements ConcreteDate { 
    String getYear() { dateChunk[0..3] } 
    String getMonth() { dateChunk[4..5] } 
    String getDay() { dateChunk[6..7] } 
} 

// the container, that holds the information 
@groovy.transform.Immutable 
class DateFormat { 
    String dateChunk 
} 

def df = new DateFormat('20150303') 
def isoDate = df as ISODate // cast the object to the trait 
assert isoDate.year == '2015' 
assert isoDate.month == '03' 
assert isoDate.day == '03' 
+1

Вы также можете использовать 'Def ISODate = df.withTraits ISODate' –

+0

@tim_yates правильно, но в этом случае я думаю, что это более читаемо с помощью «только одной черты» - так как это в основном конверсия – cfrick

+0

Согласен, но я думал, что добавлю ее для полноты ;-) –