Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二维阵列能否在给定点内容纳阵列?_Java_Arrays_List - Fatal编程技术网

Java 二维阵列能否在给定点内容纳阵列?

Java 二维阵列能否在给定点内容纳阵列?,java,arrays,list,Java,Arrays,List,我是一个相当新的程序员,有一个关于Java中数组的问题。考虑一个2D数组[i] [j]。i的值在运行时确定。已知j的值为7。在[i][6]和[i][7]中,我希望能够存储更深的数组或值列表。是否可能在数组中有类似数组的东西,在[i][6]和[7]的点上有一个x轴和y轴以及一个z轴,或者我需要一个完整的3D立方体内存来存储和导航我的数据 详细信息:我的目标是运行一个查询,从两个表(目标表和攻击者表)获取特定信息。我的查询很好,可以得到一个结果集。我真正想做的是存储结果集中的数据,并以更有用的格式将

我是一个相当新的程序员,有一个关于Java中数组的问题。考虑一个2D数组[i] [j]。i的值在运行时确定。已知j的值为7。在[i][6]和[i][7]中,我希望能够存储更深的数组或值列表。是否可能在数组中有类似数组的东西,在[i][6]和[7]的点上有一个x轴和y轴以及一个z轴,或者我需要一个完整的3D立方体内存来存储和导航我的数据

详细信息:我的目标是运行一个查询,从两个表(目标表和攻击者表)获取特定信息。我的查询很好,可以得到一个结果集。我真正想做的是存储结果集中的数据,并以更有用的格式将其显示在表中,同时将其用于数据可视化程序。我得到的字段是:服务器id、目标ip、威胁级别、客户端id、攻击者ip和攻击次数。我可以得到20条记录,它们具有相同的服务器id、目标ip、威胁级别、客户端id,但不同的攻击者ip和攻击次数,因为这台机器被攻击了20次。第三个维度允许我这样做,但是第三个轴/阵列对于服务器id、目标ip、威胁级别、客户端id都是空的

更新在查看答案并进行更多思考后,我想知道使用对象数组列表是否最适合我,和/或是否可能。对我来说,保持数据的组织性和易访问性是一个很大的问题。在psedu代码中,它是这样的:

Object[] servers
    String server_id
    String target
    String threat_level
    String client_id
    String arr[][]   // this array will hold attacker_ip in one axis and num_of_attacks in the other in order to keep the relation between the attacking ip and the number of attacks they make against one specific server
使用而不是数组基元。你可以拥有你的三维空间,而不会因为分配一个“立方体”而造成低效的浪费


如果不创建像
@nIcE cOw
这样的自定义类,那么建议的
集合对于此类事情来说比原始数组更麻烦。这是因为Java喜欢冗长,不会为您做某些事情,比如操作符重载()或使您能够轻松地从数组实例化
ArrayList

举个例子,这里是
@sbat
的ArrayList示例

publicstaticarraylisttoal(T…input){
ArrayList输出=新的ArrayList();
用于(T项:输入){
输出。添加(项目);
}
返回输出;
}
公共静态void main(字符串[]args){
ArrayList a=toAL(
土耳其人(
toAL(0,1,2)
),
土耳其人(
toAL(4,5)
),
土耳其人(
toAL(6)
)
);
System.out.println(a.get(0).get(0).get(2));
System.out.println(a.get(1.get(0.get(1));
System.out.println(a.get(2.get(0.get(0));
}

当然,从语法上讲,这样做没有什么错:

int[][][] a = {{{0, 1, 2}}, {{4, 5}}, {{6}}};
System.out.println(a[0][0].length); // 3
System.out.println(a[1][0].length); // 2
System.out.println(a[2][0].length); // 1
事实上,这就是Java中的多维数组,它们是数组中的数组。 我看到的唯一问题是,以后可能会变得混乱或难以维护,但在ArrayList中使用ArrayList也是如此:

List<List<List<Integer>>> list = ...;
System.out.println(list.get(0).get(1).get(50)); // using ArrayList
List=。。。;
System.out.println(list.get(0.get(1.get(50));//使用ArrayList

但是,仍然有一些原因可以解释为什么您更喜欢数组而不是集合。但是,根据具体情况,ArrayList或其他集合可能更可取。

首先,如果您有一个数组
数据类型[i][j]
,并且
j
已知为7,那么您可以使用的两个最大索引是5和6,而不是6和7。这是因为Java数组索引是基于0的。在创建数组时,您指示的是元素数,而不是最大索引(它总是比元素数少一个)

其次,当问题域已经使用多维数组时,使用多维数组并没有什么错。我可以想到科学应用,数据分析应用,但不多。相反,如果您正在对一个业务问题进行建模,而该问题的领域不使用多维数组,那么您可能最好使用更抽象的数据结构,而不是仅仅因为数组看起来非常有效、在数组更重要的其他语言中有经验或其他原因而将其强制纳入设计中

如果没有太多信息,我想说你的“第一维度”可以用
列表
类型(比如
ArrayList
)来更好地表示。为什么?因为你说它的大小是在运行时确定的(我假设这是间接的,而不是你从某处获得的一个幻数)<代码>列表
s类似于数组,但具有“知道”如何增长的特殊性。当程序从源读取新元素或以其他方式发现/创建新元素时,可以轻松地附加新元素。它也可以很容易地插入它们在开始或中间,但这是罕见的。

因此,第一个维度是:
ArrayList
,其中something是第二个维度的类型

关于第二个维度,您说它的大小为7,但前5个项目接受单个值,而后2个项目接受多个值。这已经告诉我,这7项是不同质的,因此数组指示错误。这个维度最好用类来表示。为了理解这个类的结构,让我们假设5个单值元素是同质的(例如,
BigDecimal
)。数组是最自然的表示形式之一,因为它的大小是已知的。剩下的两个多值元素似乎也构成了一个数组。但是,鉴于其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>() ;
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)
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 ;