首先,如果您有一个数组DataType[i][j]
并且j
已知为 7,那么您可以使用的 2 个最大索引是 5 和 6,而不是 6 和 7。这是因为 Java 数组索引是从 0 开始的。创建数组时,您指示元素的数量,而不是最大索引(它总是比元素数量少一)。
其次,当问题域已经使用多维数组时,使用多维数组并没有错。我可以想到科学应用、数据分析应用,但不多。相反,如果您正在建模一个其领域不使用多维数组的业务问题,您可能最好使用更抽象的数据结构,而不是仅仅因为数组看起来非常高效而将它们强制纳入设计,请在其他语言中使用数组是更重要,还是其他原因。
在没有太多信息的情况下,我会说您的“第一维”可以更好地用一种List
类型(比如ArrayList
)来表示。为什么?因为你说它的大小是在运行时确定的(我假设这是间接的,而不是你从某个地方获得的幻数)。 List
s 类似于数组,但具有它们“知道”如何增长的特殊性。您的程序可以在从源中读取新元素或以其他方式发现/创建它们时轻松附加新元素。它也可以很容易地将它们插入到开头或中间,但这种情况很少见。
因此,您的第一个维度将是: ArrayList<
something>
,其中something是您的第二个维度的类型。
关于第二个维度,您说它的大小为 7,但前 5 个项目接受单个值,而后 2 个项目接受多个值。这已经告诉我这 7 个项目不是同质的,因此数组是不正确的。这个维度最好用一个类来表示。为了理解这个类的结构,假设 5 个单值元素是同质的(类型,比如BigDecimal
)。最自然的表示之一是数组,因为它的大小是已知的。剩下的 2 个多值元素似乎也构成了一个数组。但是,鉴于它的 2 个元素中的每一个都包含未知数量的数据项,因此该数组的元素类型不应BigDecimal
与前一种情况一样,而是ArrayList
. 这些元素的类型ArrayList
s 是多个值的类型(也可以说BigDecimal
)。
最终结果是:
class SecondD {
BigDecimal[] singleValued= new BigDecimal[5] ;
ArrayList<BigDecimal>[] multiValued= new ArrayList<BigDecimal>[2] ;
{
multiValued[0]= new ArrayList<BigDecimal>() ;
multiValued[1]= new ArrayList<BigDecimal>() ;
}
}
ArrayList<SecondD> data= new ArrayList<SecondD>() ;
在这个代码片段中,我不仅要声明结构,还要创建它们以便它们可以使用。纯粹的声明将是:
class SecondD {
BigDecimal[] singleValued;
ArrayList<BigDecimal>[] multiValued;
}
ArrayList<SecondD> data= new ArrayList<SecondD>() ;
从类型(因此是结构)的角度来看,数组大小在 Java 中并不重要。这就是为什么你看不到任何 5 或 2。
访问数据结构就像
data.get(130).singleValued[2]
data.get(130).multiValued[1].get(27)
在某些情况下可能更清楚的可能变体是
class SecondD {
BigDecimal monday;
BigDecimal tuesday;
BigDecimal wednesday;
BigDecimal thursday;
BigDecimal friday;
ArrayList<BigDecimal> saturday= new ArrayList<BigDecimal>() ;
ArrayList<BigDecimal> sunday= new ArrayList<BigDecimal>() ;
}
ArrayList<SecondD> data= new ArrayList<SecondD>() ;
在这种情况下,我们将每个数组“扩展”为单独的项目,每个项目都有一个名称。典型的访问操作是:
data.get(130).wednesday
data.get(130).sunday.get(27)
选择哪种变体?嗯,这取决于不同项目的操作有多么相似或不同。如果每次您执行和操作时,monday
您也将执行它tuesday
, wednesday
, , thursday
and friday
(不是因为这些是完全不同的东西,还记得吗?),那么数组可能会更好。例如,要将存储为数组时的项目求和,只需:saturday
sunday
element= data.get(130) ;
int sum= 0 ;
for(int e: element.singleValued ) sum+= e ;
而如果展开:
element= data.get(130) ;
int sum= 0 ;
sum+= element.monday ;
sum+= element.tuesday ;
sum+= element.wednesday ;
sum+= element.thursday ;
sum+= element.friday ;
在这种情况下,只有 5 个元素,差异并不大。第一种方法使事情变得更短,而第二种方法使它们更清晰。就个人而言,我投票赞成明确。现在,如果不是 5 个项目,而是 1,000 个或什至少到 20 个,则第二种情况下的重复将太多,而第一种情况更受欢迎。我对此也有另一个一般规则:如果我可以分别命名每个元素,那么最好这样做。如果在尝试命名元素时,我发现自己使用数字或字母的连续字母(自然地,如一个月中的日子,或者因为事物似乎没有不同的名称),那么它就是数组。即使应用了这两个标准,您仍然可以找到不清楚的案例。本例抛硬币,开始开发程序,想一想事情会是怎样的另一种方式。你可以随时改变主意。
如果你的申请确实是科学的,请原谅我这么长(而且没用)的解释。不过,我的回答可以帮助其他人寻找类似的东西。