java - 2D数组可以在给定点内保存数组吗?

标签 java arrays list

我是一个相当新手的程序员,对Java中的数组有疑问。考虑一个二维数组[i] [j]。 i的值在运行时确定。 j的值已知为7。在[i] [6]和[i] [7],我希望能够存储更深的数组或值列表。是否可能在数组中有类似数组的内容,其中在[i] [6]和i [7]的点处有x和y轴和z轴,还是我需要完整的3D内存立方体来能够存储和浏览我的数据?

详细信息:我的目标是运行一个查询,该查询从两个表(目标表和攻击者)中获取某些信息。我的查询很好,我可以得到一个结果集。我真正想要做的是存储结果集中的数据,并以更有用的格式将其显示在表格中,同时在数据可视化程序中使用它。我得到的字段是:server_id,target_ip,威胁级别,client_id,Attacker_ip和num_of_attacks。我可以得到20条记录,这些记录具有相同的server_id,target_ip,threat_level,client_id,但不同的Attacker_ip和num_of_attacks,因为该计算机受到了20次攻击。第三维将允许我执行此操作,但对于server_id,target_ip,threat_level,client_id,第3轴/数组将为空

在查看答案并进行更多思考之后,我更新了,我想知道使用对象数组列表是否对我最合适和/或可行。使数据井井有条且易于访问对我来说是一个很大的问题。在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

最佳答案

首先,如果您有一个DataType[i][j]数组,并且j已知为7,则可以使用的2个最大索引是5和6,而不是6和7。这是因为Java数组索引基于0。创建数组时,您指定的是元素数,而不是最大索引(该索引总是比元素数小1)。

其次,当问题域已经使用多维数组时,使用多维数组并没有错。我可以想到的是科学应用程序,数据分析应用程序,但还不止这些。相反,如果您正在建模一个业务问题,而该业务领域的领域不使用多维数组,则最好使用更多的抽象数据结构,而不是仅仅因为它们看起来非常有效,而将数组强加到设计中,而要在其他语言中体验更重要或其他原因。

如果没有太多信息,我想您可以用List类型(例如ArrayList)更好地表示您的“第一维度”。为什么?因为您说它的大小是在运行时确定的(而且我认为这是间接产生的,而不是从某个地方获得的幻数)。 List与数组相似,但具有它们“知道”如何增长的特性。当程序从源中读取新元素或以其他方式发现/创建它们时,您的程序可以轻松添加新元素。它还可以轻松地将它们插入开头或中间,但这很少见。

因此,您的第一个维度将是:ArrayList< something >,其中 something 是第二个维度的类型。

关于第二维,您说它的大小为7,但是前5个项目接受单个值,而后2个为多个。这已经告诉我这7个项目不是同质的,因此数组指示错误。用一个类可以更好地表示此维度。为了理解此类的结构,我们假设5个单值元素是同质的(类型为BigDecimal)。数组是最自然的表示形式,因为它的大小是已知的。剩下的2个多值元素似乎也构成一个数组。但是,鉴于其2个元素中的每个元素都包含不确定数量的数据项,此数组的元素类型不应像以前的情况那样是BigDecimal,而是ArrayList。这些ArrayList的元素类型是多个值的类型(也称为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执行操作时,也将使用tuesdaywednesdaythursdayfriday(不是saturdaysunday,因为它们是完全不同的东西,请记住吗?)执行它,那么数组可能会更好。例如,要对存储为数组的项进行求和,则仅需要:
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个项目,而是1000个,甚至少到20个,则第二种情况下的重复次数会过多,而第一种情况下会更好。我也有另一个通用规则:如果我可以分别命名每个元素,那么最好这样做。如果在尝试为元素命名时发现自己使用数字或字母的顺序(或者自然地,例如在一个月的几天中,或者因为事物似乎没有不同的名称),那么它就是数组。即使应用了这两个条件,您仍然会发现不清楚的案例。在这种情况下,扔硬币,开始开发程序,然后再想一想其他情况。您可以随时改变主意。

如果您的应用程序确实是科学的应用程序,请原谅我这么长时间(无用)的解释。我的答案可能会帮助其他人寻找类似的东西。

关于java - 2D数组可以在给定点内保存数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18159030/

相关文章:

javascript - 如何从数组中提取对象并自动将它们放入变量中?

javascript - 如何在特定条件下显示 ng-repeat 数据 - AngularJS

arrays - 有没有一种方法可以循环整数数组,跟踪所有唯一元素而不分配新数组?

c - 在列表的开头插入节点

Java JTable 与 JComboBox

java - 当我们可以创建 String s = ("abc"时,需要什么 String s = new String "abc")

java - 如何通过 Maven 将 Google 的 OAuth 客户端导入 IntelliJ?

导出可运行 jar 后出现 Java 异常

c# - 在 C# 中,如何对 "largest"值位于列表中间的列表中的项目进行排序

c# - 在列表中查找最接近一小时前的时间戳