【发布时间】:2013-03-20 17:00:48
【问题描述】:
这是我的问题(大图)。我有一个项目使用大型和复杂的(我的意思是包含多层嵌套结构)Matlab 结构。这是可以预见的缓慢(尤其是在尝试加载/保存时)。我试图通过将其中一些结构转换为 Java 对象来改进运行时。问题是这些 Matlab 结构中的数据在很多地方都可以访问,因此任何需要重写访问语法的事情都是禁止的。因此,我需要 Java 对象尽可能地模仿 Matlab 结构的行为,特别是在访问存储在其中的值时(这些值只设置在一个地方,因此 java 中缺少运算符重载来设置不是考虑因素)。
我遇到的问题(小图)在于从这些结构的数组中访问数据。例如,
person(1)
.age = 20
.name
.first = 'John'
.last = 'Smith
person(2)
.age = 25
.name
.first = 'Jane'
.last = 'Doe'
Matlab 将允许您执行以下操作,
>>age = [person(1:2).age]
age =
20 25
尝试用 Java 完成同样的任务,
>>jperson = javaArray('myMatlab.Person', 2);
>>jperson(1) = Person(20, Name('John', 'Smith'));
>>jperson(2) = Person(25, Name('Jane', 'Doe'));
>>age = [jperson(1:2).age]
??? No appropriate method or public field age for class myMatlab.Person[]
有什么方法可以让 Java 对象模仿这种行为? 我的第一个想法是简单地扩展Person[] class,但this doesn't appear to be possible because it is final. 我的第二种方法是创建一个包含 Person 的 ArrayList 的包装类,但是我不相信这会起作用,因为调用
wrappedPerson(1:2)
将被解释为对 WrappedPerson 类的构造函数调用或尝试访问不存在的 WrappedPerson 数组的元素(因为 java 不允许我覆盖“()”运算符)。任何见解将不胜感激。
我用于 java 类的代码是
public class Person {
int _age;
ArrayList<Name> _names;
public Person(int age, Name name) {
_age = age;
_names.add(name);
}
public int age() {return _age;}
public void age(int age) {_age = age;}
public Name[] name() {return _names.toArray(new Name[0]);}
public void name(Name name) { _names.add(name);}
}
public class Name {
String _first;
String _last;
public Name(String first, String last) {
_first = first;
_last = last;
}
public int first() {return _first;}
public void first(String firstName) {_first = firstName;}
public int last() {return _last;}
public void last(String lastName) {_last = lastName;}
}
【问题讨论】:
-
考虑到:这不是 Java 运算符,您期望如何通过 1:2?
-
Matlab 自动处理该转换。如果您有一个大小为 4 的 Person 数组,person = new Person[4],您可以在 Matlab 中调用 person(1:2),它将数组的前两个元素作为大小为 2 的 Person 数组返回。
-
Waitaminnit...
[foo(1:3).bar.baz]语法是否适用于普通的 Matlab 结构,还是会引发()-indexing must appear last in an index expression错误? -
取决于什么是“bar”。如果它是一个结构数组,那么您必须分两步完成,{a = [foo(1:3).bar]; a = [a(:).baz]}