我正在尝试读取文本明文数据中的块,并将其与结构中的相应属性分开。
类似于clasic示例的C / C ++代码:
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或groovy表示这个?
答案 0 :(得分: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 :(得分:1)
在groovy中(如在Java中)没有这样的构造,因为设计目标之一是防止开发人员摆弄内存块。所以你必须想出一些方法来将它包装在类/接口中。以下是使用groovy 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'