• 关于

    C#的数组

    的搜索结果

回答

以下文字摘自《C陷阱与缺陷》,写的非常好,很有必要摘录下来和大家一同分享。       C语言中的数组值得注意的地方有以下两点:       1.C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常熟确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出一个多维数组就不是一件难事。        2.对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标 进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。 ######可不可以理解这是广告###### 难掌握的是计算机体系 搞不懂指针的都是体系没学好的 ######国内好多数组和指针搞不清楚的教材害人呀。######明显广告######受益匪浅,对指针的看法有了更具体的认识,没那么抽象了。
kun坤 2020-06-09 19:20:10 0 浏览量 回答数 0

回答

已经结贴。 花费时间:17ms 起始位置:9736 9745 9740 9747 9796  当前位置:316 318 318 318 318  前序位置:319 319 319 320 319  在50000个数据的情况下,用17ms找到合适的位置,效果不错,100红包已发,本帖结束。######我大体明白楼主的意思了 大约就是这么一个东西 /** * 存放有序不定长数组的list */ private List<int[]> orderNoList; /** *如果按照某种顺序从list中取出一定数量的数字的话 *param acquiredNoSum 所取得数字的总数量 *return eachAcquiredNoCount 各自所取数字的数量 */ public int[] geteachAcquiredNoCount (int acquiredNoSum){ // todo return new int[10] ; }</code></pre> 不过你没有说明是按照什么样的顺序取得数字,但你强调了取出有序数我暂且按照以下算法从数组中取数 假定a为下一个被取出的数,a满足以下条件 1,a存在于list orderNoList中的一个数组中 2,假定有序数组b存放有所有已被取出的数并且c表示max(b), 则a=min(orderNoListv中未取数)(多个数组中的最小数字相等时取靠前的一个) 并且a>=c   可以将具体的取数算法封装起来,替换成自己需要的算法 具体算法为 用一个int 数组当作游标 另一个int数组存放待比较的数 通过游标得到待比较数组   得出待比较数组中最小的数对应数组序号以及,相应游标加1,从相应数组取出一个数更新待比较数组,,重复这一步直到所有游标之和等于需取出数的数量 返回游标数组 算法时间复杂度为O(n)与从n个数中找出最小的数是一个数量级,我觉得不可能还有比这更高效的算法了    ######谢谢回复,你的算法有解,但是还不够高效:)######@红薯 直接粘贴上传还是不支持,chrome和safari都不行。######【返回值为每个列表长度的长度为10的整数数组】是什么意思######已调整说明######我先回去学学语文~  ######已调整说明,请在看看?######看完这个需求后,我也觉得我该回去重新读一遍新华字典了######任意一个数组从其对应位置开始的数字都不大于其他数组对应位置前的数字 那么是都相等咯?######语文老师的棺材板要按不住了######这个问题确实比较难描述,主要看图和标红了的部分吧######命题需要重新措辞,以便确切地表明具体场景。如开场白是否改为: 用JAVA语言完成方法getOrderLIst 的代码填写任务。如静态代码块所示,现已拥有一个长度为10的数组 list。  它的每个元素都是一个已经按照从小到大排序好的 List<Integer>实体。 …######回复 @tcxu : 非常好,如果看懂了,来一个普通人懂得版本。######真心读不懂,也不知道"分界索引值"是个什么东西,怎么算出来的.
kun坤 2020-05-31 17:50:38 0 浏览量 回答数 0

回答

在明确list大小情况下应该尽可能的给定初始容量,节省内存开销。很多情况我们不知道初始容量,所以一般没有传入此参数,这样一来,其容量的扩充是基于2的多少次方来计算的,扩容的时候或许初始化了很多数组元素,但可能绝大部分没用到,这就浪费内存了。######回复 @PengTdy : 好像list如果不传入初始容量,默认初始容量是16,如果add了17个,那么容量变为32,add了33个变为64......,注意这里的16、 32、 64......。当然动态扩容的时候会重新分配list内部数组的内存空间,然后进行数据拷贝。如果程序员预先知道会add多少个,那么传入初始容量,就省去了扩容数组和数据拷贝,不管是内存分配和执行效率都会提升的。######回复 @BoXuan : 好的谢谢######回复 @PengTdy : 一般的数组是不能动态扩容的,list其实就是动态扩容数组,内部实现还是基于数组的。这个初始容量就是指示list内部数组初始化几个数组元素,你这里是2,就是初始化2个数组元素,而你这又刚好add了2个,你再add一下,内部数组扩容就会基于2的多少次方去重新初始化多少个数组元素,你可以找找ArrayList的源码看看######是不是 如果初始化值那里我设置的是3是不是就是3的次方,如果设置的6是不是就是6的次方;如果没有指定就是默认2的次方?######时刻想到,要节约使用内存空间。###### 图片里面圈出来的那个2是List初始大小.文档要求的那部分是String[] array = new String[list.size()],要求array的大小和list.size()一致.######回复 @PengTdy : 因为后来要把list里的数据(所有字符串元素),都储存到字符串数组 array之中。试想一下,如果创建的字符串空间(array数组长度)太小,则不够存下 list 的所有元素;如果创建的字符串空间(array数组长度)太大,则没必要(太浪费)。故,一致才好。######这保持一致有什么好处吗?###### ArrayList 实现了接口 List<E>。所以,用 ArrayList 的构造方法所生成的对象, 可以用这个接口的名称 List<String>来表示其类型 。因为 List<E> 的泛型 E, 是字符串类型,所以在调用 ArrayList 的构造方法时,必须 指明它的元素是字符串类型:new ArrayList<String>(…);通过多态地挑选,选定的ArrayList 的构造方法是:public ArrayList(int initialCapacity)。调用这个函数的结果是,构造一个具有指定初始容量的空列表。其中参数:initialCapacity,表示列表的初始容量。在给出的代码里,initialCapacity 是 2。 “每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。”(出自: API 手册)从提供的代码可以看到,你提出的圆括号里的 2,表示要求产生的列表 list的初始容量是2个元素。接下来,果然添加了两个字符串元素: “guan”和 “bao”。看来,用来存储列表元素的数组的大小 2,正好够用。因此,list 的大小(list.size())仍然是 2。所以,最终导致创建并赋值的的字符串数组 array的长度,也是 2 。总之,你所提出的 (2 ), 虽然只是 列表的初始容量。但 碰巧后来,只添加了2个字符串,致使,list 的大小未变,导致最终字符串数组的长度,也只是2。######回复 @PengTdy : 建议阅读 http://blog.csdn.net/arui319/article/details/3557743######如果初始化值那里我设置的是3是不是就是3的次方,如果设置的6是不是就是6的次方;如果没有指定就是默认2的次方?###### 大家的回复果然很溜。###### 预先分配容器的容量,1:可以节省内存使用;2:可以减少频繁扩容导致的内存垃圾和数组拷贝损耗。
kun坤 2020-06-10 09:35:33 0 浏览量 回答数 0

问题

动态规划套路:最大子数组和 5月25日 【今日算法】

最大子数组问题和前文讲过的 经典动态规划:最长递增子序列 的套路非常相似,代表着一类比较特殊的动态规划问题的思路: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组&#x...
游客ih62co2qqq5ww 2020-05-25 09:38:08 1 浏览量 回答数 0

问题

见证一位普通程序员如何征服数据结构

数据结构对于程序员十分重要,无论学习任何编程语言,都需要数据结构的加持。从最最最基础的开始,带你踏上算法的不归路。 每天更新一题 ,与大家共勉!持续更新~ 每日一题会在...
苍霞学子 2020-03-25 23:18:05 176 浏览量 回答数 1

回答

数组是数组,指针是指针,但是在大多数情况下,数组名称会转换为指针。经常使用的术语是它们衰减到指针。 这是一个数组: int a[7]; a 包含七个整数的空间,您可以通过赋值在其中一个中放置一个值,如下所示: a[3] = 9; 这是一个指针: int *p; p不含整数的空格,但可以指向整数的空格。例如,我们可以将其设置为指向数组中的一个位置a,例如第一个位置: p = &a[0]; 令人困惑的是,您也可以这样写: p = a; 这并没有数组的内容复制a到指针p(无论这将意味着)。而是将数组名称a转换为指向其第一个元素的指针。因此该分配与上一个分配相同。 现在,您可以p以类似于数组的方式使用: p[3] = 17; 这样做的原因是C中的数组解引用运算符[ ]是根据指针定义的。x[y]方法:先从指针x,步y以后有什么指针指向元素向前,然后采取一切是存在的。使用指针算术语法,x[y]也可以写成*(x+y)。 为了使其与普通数组(例如our)一起使用a,必须首先将ain中的名称a[3]转换为指针(指向中的第一个元素a)。然后,我们将3个元素向前移动,并采用其中的任何内容。换句话说:将元素放在数组中的位置3。(这是数组中的第四个元素,因为第一个元素的编号为0。) 因此,总而言之,在大多数情况下,C程序中的数组名称都将转换为指针。一个例外是当我们sizeof在数组上使用运算符时。如果a在这种情况下被转换为指针,sizeof a则将给出指针的大小,而不是实际数组的大小,这将毫无用处,因此在这种情况下a意味着数组本身。 问题来源于stack overflow
保持可爱mmm 2020-01-16 16:49:53 0 浏览量 回答数 0

回答

看不出$old数组和$add数组 存在什么关联。 假设这两个数组都是二维数组,把$old和$add都写成二维表格的形式,然后两个表格拼起来和你要的结果类似。但是type1不一样啊,结果也不一样啊 ###### 引用来自“boot2later”的评论 看不出$old数组和$add数组 存在什么关联。 假设这两个数组都是二维数组,把$old和$add都写成二维表格的形式,然后两个表格拼起来和你要的结果类似。但是type1不一样啊,结果也不一样啊 谢谢回复。 我是想把后得到的值$add ,添加到$old,得到新值$new。不知php如何写。麻烦您有空能写下么,谢谢 <?php $add=array ( 0 => array ( 0 => 'ADDtype2value0 ADDtype3value0', 1 => 'ADDtype2value1 ADDtype3value1', 2 => 'ADDtype2value2 ADDtype3value2', ), 1 => array ( 0 => 'ADDtype2value0', 1 => 'ADDtype2value1', 2 => 'ADDtype2value2', ), 2 => array ( 0 => 'ADDtype3value0', 1 => 'ADDtype3value1', 2 => 'ADDtype3value2', ), ); ?> ######谢谢您######两个数组合并,要么是结构一致,要么逻辑一致。 这样在合并时 才有章可循呐。 你提供的两个数组$old和$add,在结构上(键值)不一致,逻辑关系也没有说清楚。######如果是单纯的追加到数组后面 是比较简单的。 但是$add数组中的第0行数据(比如 $add[0][0]) ,按你的想法合并后为啥就消失了?
kun坤 2020-06-09 22:16:17 0 浏览量 回答数 0

回答

编译的版本使用数组初始化程序进行初始化list1。C#语言规范§1.110(“数组初始化器”)规定: 数组初始化程序由一系列变量初始化程序组成,这些变量初始化程序由“ {”和“}”标记包围,并由“,”标记分隔。每个变量初始化器都是一个表达式,对于多维数组,则是一个嵌套数组初始化器。 使用数组初始化程序的上下文确定要初始化的数组的类型。在数组创建表达式中,数组类型紧接在初始化器之前,或者从数组初始化器中的表达式推断出来。在字段或变量声明中,数组类型是要声明的字段或变量的类型。 在字段或变量声明中使用数组初始化程序时,例如: int[] a = {0, 2, 4, 6, 8}; 它只是等效数组创建表达式的简写形式: int[] a = new int[] {0, 2, 4, 6, 8}; 因此很明显,应该编译。 第二个版本使用显式的数组创建表达式,您可以在其中明确指示编译器创建哪种类型的数组。§1.51.10.4(“数组创建表达式”)规定: 第三种形式的数组创建表达式称为 隐式类型的数组创建表达式。它与第二种形式相似,不同之处在于未明确给出数组的元素类型,而是将其确定为数组初始值设定项中表达式集的最佳通用类型(第1.50.2.14节)。 因此,第二个版本相当于 object[] list2 = new int[] { 0, 1 }; 因此,问题实际上变成了“为什么我不能分配int[]一个object[]”,就像您在问题末尾提到的那样。答案也很简单,如第1.109节(“数组协方差”)所示: 数组协方差尤其不扩展到值类型数组。例如,不存在允许将an int[] 视为的转换object[]。
保持可爱mmm 2020-02-08 22:08:13 0 浏览量 回答数 0

回答

清除现有数组的方法A: 方法1 (这是我对问题的原始回答) A = []; 此代码会将变量A设置为新的空数组。如果您在其他任何地方都没有引用原始数组,A那么这是完美的,因为这实际上会创建一个全新的(空)数组。您应谨慎使用此方法,因为如果您从另一个变量或属性引用了此数组,则原始数组将保持不变。仅当仅通过其原始变量引用该数组时,才使用它A。 这也是最快的解决方案。 此代码示例显示使用此方法时可能遇到的问题: var arr1 = ['a','b','c','d','e','f']; var arr2 = arr1; // Reference arr1 by another variable arr1 = []; console.log(arr2); // Output ['a','b','c','d','e','f'] 方法2(由Matthew Crumley 建议) A.length = 0 这将通过将其长度设置为0来清除现有数组。有人认为这可能不适用于JavaScript的所有实现,但事实并非如此。当在ECMAScript 5中使用“严格模式”时,它也可以工作,因为数组的length属性是读/写属性。 方法3(由Anthony 建议) A.splice(0,A.length) 使用.splice()将完美地工作,但是由于该.splice()函数将返回一个包含所有已删除项目的数组,因此它实际上将返回原始数组的副本。基准表明,这对性能没有任何影响。 方法4(由tanguy_k 建议) while(A.length > 0) { A.pop(); } 该解决方案不是很简洁,它也是最慢的解决方案,与原始答案中引用的早期基准相反。 性能 在清除现有数组的所有方法中,方法2和3在性能上非常相似,并且比方法4快得多。请参阅此基准测试。 正如Diadistis在下面的回答中所指出的那样,用于确定上述四种方法的性能的原始基准存在缺陷。原始基准测试重复使用了已清除的数组,因此第二次迭代将清除已经为空的数组。 以下基准测试可修复此缺陷:http : //jsben.ch/#/hyj65。它清楚地表明方法#2(长度属性)和#3(拼接)是最快的(不计算不会改变原始数组的方法#1)。 问题来源于stack overflow
保持可爱mmm 2020-01-08 15:34:18 0 浏览量 回答数 0

问题

【今日算法】4月22日-删除排序数组中的重复项

我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N)ÿ...
游客ih62co2qqq5ww 2020-04-23 07:20:29 27 浏览量 回答数 1

回答

当条件为时,可以将数组散布在数组内部,以保持项目数组清洁false。 这是您的操作方法: // Will result in ['foo', 'bar'] const items = [ 'foo', ... true ? ['bar'] : [], ... false ? ['falsy'] : [], ] console.log(items) 说明: 如您所见,三元运算符总是返回一个数组。 如果条件是true,则返回['bar'],否则返回空数组[]。 之后,我们展开...结果数组(来自三元运算),并将数组的项目推送到父数组。 如果没有任何数组项(当三元检查为时false),则不会执行任何操作,这是我们的目标。
保持可爱mmm 2020-02-09 13:40:22 0 浏览量 回答数 0

回答

当您刚刚学习C时,我建议您首先真正地尝试理解数组和指针之间的差异,而不是普通的事物。 在参数和数组方面,有一些令人困惑的规则应该在继续之前弄清楚。首先,您在参数列表中声明的内容是特殊的。在某些情况下,将事情作为C中的函数参数没有意义。 用作参数 数组作为参数 数组作为参数 第二个也许还不清楚。但是,当您考虑到数组维的大小是C语言中的类型的一部分时(而未给出维大小的数组具有不完整的类型),这一点就变得很清楚。因此,如果您要创建一个函数,该函数需要一个按值作为数组的值(接收一个副本),那么它只能对一个大小执行此操作!另外,数组可能会变大,并且C会尝试尽可能快。 由于这些原因,在C中,不存在数组值。如果要获取数组的值,则获取的是指向该数组第一个元素的指针。解决方案实际上已经在这里。C编译器不会预先绘制无效的数组参数,而是将各个参数的类型转换为指针。记住这一点,这非常重要。该参数不是数组,而是一个指向相应元素类型的指针。 现在,如果您尝试传递数组,则传递的是指向数组第一个元素的指针。 游览:用作参数 为了完整起见,并且因为我认为这将帮助您更好地理解问题,所以让我们看看尝试将函数用作参数时的事务状态。确实,首先这没有任何意义。参数如何成为函数?嗯,我们当然想要那个地方的变量!那么,当这种情况发生的编译器所做的是,再次,要转变功能为函数指针。尝试传递一个函数将改为传递一个指向该函数的指针。因此,以下内容相同(类似于数组示例): void f(void g(void)); void f(void (*g)(void)); 请注意,g需要用括号括起来。否则,它将指定一个returning函数void,而不是一个指向returning函数的指针void。 返回数组 现在,我在开始时说过数组可以具有不完整的类型-如果您还不提供大小,则会发生这种情况。由于我们已经发现数组参数不存在,而是任何数组参数都是指针,因此数组的大小无关紧要。这意味着,编译器将翻译以下所有内容,并且都是同一件事: int main(int c, char **argv); int main(int c, char *argv[]); int main(int c, char *argv[1]); int main(int c, char *argv[42]); 当然,可以在其中放置任何大小没有多大意义,只是被扔掉了。因此,C99为这些数字提出了新的含义,并允许在括号之间显示其他内容: // says: argv is a non-null pointer pointing to at least 5 char*'s // allows CPU to pre-load some memory. int main(int c, char *argv[static 5]); // says: argv is a constant pointer pointing to a char* int main(int c, char *argv[const]); // says the same as the previous one int main(int c, char ** const argv); 最后两行说您将无法在函数中更改“ argv”-它已成为const指针。不过,只有少数C编译器支持这些C99功能。但是这些功能清楚地表明“数组”实际上不是一个。这是一个指针。 一句警告 请注意,仅当您将数组作为函数的参数时,上述所有内容才是正确的。如果您使用本地数组,则数组将不是指针。这将表现为指针,因为当读出其值如前面所述阵列将被转换为一个指针。但这不应与指针混淆。 以下是一个经典的示例: char c[10]; char **c = &c; // does not work. typedef char array[10]; array *pc = &c; // does work. // same without typedef. Parens needed, because [...] has // higher precedence than '*'. Analogous to the function example above. char (*array)[10] = &c;
保持可爱mmm 2020-02-07 22:36:52 0 浏览量 回答数 0

回答

一个是数组数组,一个是2d数组。前者可以锯齿状,后者是统一的。 也就是说,a double[][]可以有效地是: double[][] x = new double[5][]; x[0] = new double[10]; x[1] = new double[5]; x[2] = new double[3]; x[3] = new double[100]; x[4] = new double[1]; 因为数组中的每个条目都是对数组的引用double。对于锯齿状数组,可以在第二个示例中对数组进行分配: x[0] = new double[13]; 在第二项上,因为它是统一的2d数组,所以不能将1d数组分配给行或列,因为必须同时对行和列进行索引,这会使您陷入单一double: double[,] ServicePoint = new double[10,9]; ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index. 更新: 根据您的问题进行澄清,您的#1出现语法错误的原因是因为您有以下原因: double[][] ServicePoint = new double[10][9]; 并且您不能在构造时指定第二个索引。关键在于ServicePoint 不是 2d数组,而是1d数组(数组),因此,由于要创建1d数组(数组),因此只能指定一个索引: double[][] ServicePoint = new double[10][]; 然后,当在阵列中创建的每个项目,每个这些也都是阵列,所以然后可以指定它们的尺寸(其可以是不同的,因此术语锯齿状排列): ServicePoint[0] = new double[13]; ServicePoint[1] = new double[20]; 问题来源于stack overflow
保持可爱mmm 2020-01-14 15:02:45 0 浏览量 回答数 0

问题

二分查找及对应经典题目

二分查找(Binary Search)属于七大查找算法之一,又称折半查找,它的名字很好的体现出了它的基本思想,二分查找主要是针对的是有序存储的数据集合。 假设有一个集合和一个待查找的目标值...
问问小秘 2020-07-03 16:20:06 3 浏览量 回答数 1

回答

使用限制 期望实例数变化规则 并行伸缩活动示例 非并行伸缩活动示例 通过期望实例数功能,您可以一键设定伸缩组内的ECS实例数量,同时灵活地执行并行伸缩活动。 期望实例数介绍 指定期望实例数后,伸缩组会自动将ECS实例数量维持在期望实例数,无须人工干预。期望实例数功能可以有效解决以下问题: 伸缩活动执行失败时,需要手动重试。 存在执行中的伸缩活动时,不能执行新的伸缩活动,伸缩组利用率低。 新建伸缩组时,填写伸缩组内期望实例数即可自动开启期望实例数功能,已指定期望实例数的伸缩组支持修改期望实例数。 说明 只能在新建伸缩组时开启期望实例数功能,不支持通过修改已有伸缩组开启该功能。 使用期望实例数功能前,请了解以下概念: 概念 说明 稳态实例 伸缩组中处于服务中、保护中和备用中状态的实例。 并行伸缩活动 存在执行中的并行伸缩活动时,可以执行其它并行伸缩活动。包括通过以下方式触发的伸缩活动: 手动执行伸缩规则、通过定时任务执行伸缩规则 手动添加实例、手动移出实例 期望实例数检查任务、实例健康检查任务、最大最小值检查任务 非并行伸缩活动 存在执行中的非并行伸缩活动时,不能执行其它伸缩活动。并行伸缩活动以外的伸缩活动均属于非并行伸缩活动。包括但不限于通过以下方式触发的伸缩活动: 通过报警任务执行伸缩规则 手动执行再均衡分布 抢占式实例补偿任务 使用限制 已指定期望实例数的伸缩组不支持置空期望实例数,即不支持关闭该功能。 期望实例数必须小于伸缩组内最大实例数,且必须大于伸缩组内最小实例数。 期望实例数变化规则 除手动设定期望实例数外,执行伸缩活动也可能导致期望实例数变化,具体变化情况和伸缩活动触发方式有关。 伸缩活动类型 伸缩活动触发方式 伸缩活动效果 期望实例数变化 示例 并行伸缩活动 手动执行伸缩规则 只修改期望实例数,等待期望实例数检查任务触发扩缩容 稳态实例数±扩缩容数量 场景: 当前期望实例数:3台 当前稳态实例数:2台 伸缩规则要求创建4台ECS实例 结果: 期望实例数变为6台,但不会立即创建ECS实例,等待期望实例数检查任务触发扩缩容。 通过定时任务执行伸缩规则 只修改期望实例数,等待期望实例数检查任务触发扩缩容 稳态实例数±扩缩容数量 场景: 当前期望实例数:3台 当前稳态实例数:2台 伸缩规则要求创建4台ECS实例 结果: 期望实例数变为6台,但不会立即创建ECS实例,等待期望实例数检查任务触发扩缩容。 手动添加实例 直接触发扩容,然后修改期望实例数 当前期望实例数+扩容数量 场景: 当前期望实例数:3台 当前稳态实例数:2台 手动添加4台已有的ECS实例 结果: 4台ECS实例加入伸缩组,稳态实例数变为6台,然后期望实例数变为7台。 手动移出实例 直接触发缩容,然后修改期望实例数 当前期望实例数-缩容数量 场景: 当前期望实例数:3台 当前稳态实例数:2台 手动移出1台ECS实例 结果: 1台ECS实例移出伸缩组,稳态实例数变为1台,然后期望实例数变为2台。 最大最小值检查任务 - 需要手动设定期望实例数 场景: 当前最大实例数:5台 当前最小实例数:0台 当前期望实例数:3台 当前稳态实例数:2台 尝试修改最大实例数为1。 结果: 修改失败,您需要同时设定期望实例数。 实例健康检查任务 直接触发缩容 期望实例数不变 场景: 当前期望实例数:3台 当前稳态实例数:2台 1台ECS实例被诊断为不健康 结果: 期望实例数不变,不健康的ECS实例被移出伸缩组,稳态实例数变为1台。伸缩组检测到期望实例数和稳态实例数间存在差距,会自动执行期望实例数检查任务,触发伸缩活动创建2台ECS实例。 期望实例数检查任务 直接触发扩缩容 期望实例数不变 场景: 当前期望实例数:3台 当前稳态实例数:2台 结果: 期望实例数不变。伸缩组检测到期望实例数和稳态实例数间存在差距,会自动执行期望实例数检查任务,触发伸缩活动创建1台ECS实例。 非并行伸缩活动 通过报警任务执行伸缩规则 直接触发扩缩容,然后修改期望实例数 稳态实例数±扩缩容数量 场景: 当前期望实例数:3台 当前稳态实例数:2台 伸缩规则要求创建4台ECS实例 结果: 触发伸缩活动创建4台ECS实例,然后期望实例数变为6台。 并行伸缩活动示例 指定期望实例数后,伸缩组支持同时执行并行伸缩活动,示例如下: 示例1:连续手动执行伸缩规则 场景: 期望实例数:3台 稳态实例数:3台 伸缩规则add3要求创建3台ECS实例 伸缩规则add1要求创建1台ECS实例 手动执行add3,然后立即手动执行add1 结果:执行add3后,期望实例数从3台变为6台。可以立即执行add1,期望实例数从6台变为4台。并行伸缩活动的效果是创建1台ECS实例。 示例2:手动执行伸缩规则的同时手动添加实例 场景: 期望实例数:3台 稳态实例数:3台 伸缩规则add1要求创建1台ECS实例 手动执行add1,然后立即手动添加1台已有ECS实例 结果:执行add1后,期望实例数从3台变为4台。可以立即添加已有ECS实例,期望实例数从4台变为5台。并行伸缩活动的效果是创建1台ECS实例并添加1台已有ECS实例。 非并行伸缩活动示例 指定期望实例数后,伸缩组不支持同时执行并行伸缩活动和非并行伸缩活动,示例如下: 场景: 期望实例数:1台 稳态实例数:1台 报警任务伸缩规则要求创建3台ECS实例 伸缩规则add1要求创建1台ECS实例 报警任务触发后立即手动执行add1 结果:报警任务触发伸缩活动,期望实例数从1台变为4台。由于报警任务触发的伸缩活动属于非并行伸缩活动,不支持立即执行并行伸缩活动,伸缩规则add1被拒绝执行,期望实例数仍为4台。
1934890530796658 2020-03-21 23:01:45 0 浏览量 回答数 0

回答

数组的名称通常以数组的第一个元素的地址求值,因此,array且&array具有相同的值(但类型不同,因此array+1,如果数组长于1个元素,&array+1则将不相等)。 对此有两个例外:当数组名称是sizeof或一元运算符&(地址)的操作数时,名称是指数组对象本身。因此sizeof array,您可以得到整个数组的大小(以字节为单位),而不是指针的大小。 对于定义为的数组T array[size],它将具有type T *。当/如果增加它,您将到达数组中的下一个元素。 &array计算结果到相同的地址,但是给定相同的定义,它将创建该类型的指针T(*)[size]-即,它是指向数组而不是单个元素的指针。如果增加此指针,它将增加整个数组的大小,而不是单个元素的大小。例如,使用如下代码: char array[16]; printf("%p\t%p", (void*)&array, (void*)(&array+1)); 我们可以预期第二个指针比第一个指针大16(因为它是16个char的数组)。由于%p通常将指针转换为十六进制,因此它可能类似于: 0x12341000 0x12341010 问题来源于stack overflow
保持可爱mmm 2020-01-16 17:23:59 0 浏览量 回答数 0

回答

Java 的 Tuple 元组数据类型 元组类型,即 Tuple 常在脚本语言中出现,例如 Scala 的 ("Unmi", "china@qq.com", "blahbla")。元组可认为是象数组一样的容器,它的目的是让你方便构造和引用,例如 Pair 可认为是一个只能存两个元素的元组,像是个 Map; 真正的元组应该是可以任意多个元素的容器,绕来绕去,它还是数组,或列表,所以我们实现上还是要借助于数组或是列表。 先看 Scala 中什么是元组: val tuple = ("Unmi", "fantasia@sina.com", "blahblah...") println(tuple._1) //输出 Unmi Scala 中访问从 1 开始,用 ._1 方式来访问其中的元素。 场景:当在一个方法中, 你需要返回几个对象,这几个对象的类型一致,你可以返回一个数组;如果几个对象的类型不同呢,当然你可以返回一个Object[]数组,可是这样在使用结果数组的时候,就需要强转对象的类型,会导致类型不安全;也可以定义一个dto,当多个场景下需要使用的不同,需要定义多个dto,这样会类爆炸,而且重用率极低;在非常接近Java语言的Scala里有元组的定义:val t = (1, 3.14, "Fred"),就是一个不同类型的数据放到一个线性集合里,在Java里我们可以模拟出一个类似的结构,以适合上面的场景。
谙忆 2020-01-09 20:23:40 0 浏览量 回答数 0

问题

JavaScript数组的大O

JavaScript中的数组很容易通过添加和删除项来进行修改。它在某种程度上掩盖了一个事实,即大多数语言数组的大小都是固定的,并且需要复杂的操作来调整大小。看起来,JavaScript使编写性能不佳...
保持可爱mmm 2020-02-10 16:02:49 44 浏览量 回答数 2

问题

数组与向量:入门的相似点和不同点

C ++中的数组和向量之间有什么区别?差异的示例可能包括库,符号,能力等。 数组 数组包含特定数量的特定类型的元素。为了使编译器可以在编译程序时保留所需的空间量,必须...
保持可爱mmm 2020-02-08 11:05:09 0 浏览量 回答数 1

回答

JavaScript具有强大的语义,可以遍历数组和类似数组的对象。我将答案分为两部分:真正数组的选项,以及仅是数组之类的东西的选项,例如arguments对象,其他可迭代对象(ES2015 +),DOM集合,等等。 我会很快注意到,您现在可以通过将ES2015转换为ES5 ,甚至在ES5引擎上使用ES2015选项。搜索“ ES2015 transpiling” /“ ES6 transpiling”以了解更多... 好吧,让我们看看我们的选择: 对于实际数组 您目前在ECMAScript 5(“ ES5”)中拥有三个选项,这是目前最广泛支持的版本,在ECMAScript 2015中又添加了两个选项(“ ES2015”,“ ES6”): 使用forEach及相关(ES5 +) 使用一个简单的for循环 正确使用for-in 使用for-of(隐式使用迭代器)(ES2015 +) 明确使用迭代器(ES2015 +) 细节: 1.使用forEach及相关 在任何可以访问ArrayES5(直接或使用polyfills)添加的功能的模糊现代环境(因此,不是IE8)中,都可以使用forEach(spec| MDN): var a = ["a", "b", "c"]; a.forEach(function(entry) { console.log(entry); }); forEach接受回调函数,以及(可选)this调用该回调时要使用的值(上面未使用)。依次为数组中的每个条目调用回调,从而跳过稀疏数组中不存在的条目。尽管上面只使用了一个参数,但回调函数使用以下三个参数调用:每个条目的值,该条目的索引以及对要迭代的数组的引用(以防您的函数尚未使用它) )。 除非您支持IE8之类的过时浏览器(截至2016年9月,NetApps在该市场上所占份额刚刚超过4%),forEach否则您可以在没有垫片的情况下在通用网页中愉快地使用。如果您确实需要支持过时的浏览器,forEach则可以轻松进行填充/填充(搜索“ es5 shim”以获得多个选项)。 forEach 这样做的好处是您不必在包含范围中声明索引和值变量,因为它们是作为迭代函数的参数提供的,因此可以很好地将作用域限定为该迭代。 如果您担心为每个数组条目进行函数调用的运行时成本,请不必担心;细节。 此外,forEach它是“遍历所有对象”功能,但是ES5定义了其他几个有用的“遍历数组并做事”功能,包括: every(在第一次返回回调false或出现错误时停止循环) some(在第一次返回回调true或发生错误时停止循环) filter(创建一个新数组,其中包含过滤器函数返回的元素,true并省略其返回的元素false) map (根据回调返回的值创建一个新数组) reduce (通过重复调用回调并传入先前的值来建立值;有关详细信息,请参见规范;对汇总数组内容和许多其他内容很有用) reduceRight(如reduce,但按降序而不是升序工作) 2.使用一个简单的for循环 有时,旧方法是最好的: var index; var a = ["a", "b", "c"]; for (index = 0; index < a.length; ++index) { console.log(a[index]); } 如果数组的长度将不会在循环过程中改变,它在性能敏感的代码(不可能),一个稍微复杂一点的版本抓住了长度达阵可能是一个很小的有点快: var index, len; var a = ["a", "b", "c"]; for (index = 0, len = a.length; index < len; ++index) { console.log(a[index]); } 和/或倒数: var index; var a = ["a", "b", "c"]; for (index = a.length - 1; index >= 0; --index) { console.log(a[index]); } 但是,使用现代JavaScript引擎,很少需要消耗掉最后的能量。 在ES2015及更高版本中,可以使索引和值变量在for循环本地: let a = ["a", "b", "c"]; for (let index = 0; index < a.length; ++index) { let value = a[index]; console.log(index, value); } //console.log(index); // would cause "ReferenceError: index is not defined" //console.log(value); // would cause "ReferenceError: value is not defined" 而且,当您执行此操作时,不仅会为每个循环迭代创建一个新的闭包,value而且还会index为每个循环迭代重新创建一个闭包,这意味着在循环主体中创建的闭包保留对为该特定迭代创建的index(和value)的引用: let divs = document.querySelectorAll("div"); for (let index = 0; index < divs.length; ++index) { divs[index].addEventListener('click', e => { console.log("Index is: " + index); }); } 如果您有五个div,则单击第一个将获得“索引为:0”,如果单击最后一个则将为“索引为:4”。如果您使用而不是则无法使用。varlet 3. 正确使用for-in 你会得到别人告诉你使用for-in,但是这不是for-in对。for-in遍历对象的可枚举属性,而不是数组的索引。甚至在ES2015(ES6)中也不保证顺序。ES2015 +不定义为对象属性(通过[[OwnPropertyKeys]],[[Enumerate]]以及使用他们喜欢的东西Object.getOwnPropertyKeys),但它并没有定义for-in将遵循这个顺序。(其他答案的详细信息。) for-in数组上唯一真正的用例是: 这是一个稀疏的数组,里面有巨大的空隙,或者 您正在使用非元素属性,并且希望将它们包括在循环中 仅查看第一个示例:for-in如果使用适当的保护措施,则可以用来访问那些备用阵列元素: // a is a sparse array var key; var a = []; a[0] = "a"; a[10] = "b"; a[10000] = "c"; for (key in a) { if (a.hasOwnProperty(key) && // These checks are /^0$|^[1-9]\d*$/.test(key) && // explained key <= 4294967294 // below ) { console.log(a[key]); } } 请注意以下三个检查: 该对象具有该名称的自身属性(不是从其原型继承的属性),并且 该键是所有十进制数字(例如,正常的字符串形式,而不是科学计数法),并且 该键的值在被强制为数字时为<= 2 ^ 32-2(即4,294,967,294)。这个数字从哪里来?它是规范中数组索引定义的一部分。其他数字(非整数,负数,大于2 ^ 32-2的数字)不是数组索引。它的2 ^ 32的理由- 2是使得大于2 ^ 32下一个最大的索引值- 1,这是一个数组的最大值length可以有。(例如,数组的长度适合于32位无符号整数。)(向RobG表示支持,在我的博客文章的评论中指出我先前的测试不太正确。) 当然,您不会在内联代码中执行此操作。您将编写一个实用程序函数。也许: 4.使用for-of(隐式使用迭代器)(ES2015 +) ES2015将迭代器添加到JavaScript。使用迭代器最简单的方法是new for-of语句。看起来像这样: const a = ["a", "b", "c"]; for (const val of a) { console.log(val); } 在幕后,它从数组中获取一个迭代器并循环遍历,从而从中获取值。这没有使用for-inhas 的问题,因为它使用了由对象(数组)定义的迭代器,并且数组定义了其迭代器遍历其条目(而不是其属性)。与for-inES5 不同,访问条目的顺序是其索引的数字顺序。 5.明确使用迭代器(ES2015 +) 有时,您可能想显式使用迭代器。您也可以这样做,尽管它比笨拙得多for-of。看起来像这样: const a = ["a", "b", "c"]; const it = a.values(); let entry; while (!(entry = it.next()).done) { console.log(entry.value); } 迭代器是与规范中的迭代器定义匹配的对象。每次调用时,其next方法都会返回一个新的结果对象。结果对象具有属性,done告诉我们是否完成操作,以及一个value具有该迭代值的属性。(done如果是false,value则为可选,如果是,则为可选undefined。) 的含义value取决于迭代器;数组至少支持三个返回迭代器的函数: values():这是我上面使用的那个。它返回迭代,其中每个value是用于该迭代阵列条目("a","b",和"c"在实施例更早)。 keys():返回一个迭代器,每个迭代器value都是该迭代的关键(因此,对于我们a上面的代码,将是"0",然后是"1",然后是"2")。 entries():返回一个迭代器,其中每个迭代器value都是[key, value]该迭代形式的数组。 对于类似数组的对象 除了真正的数组之外,还有一些类数组对象,它们具有一个length或多个具有数字名称的属性:NodeList实例,arguments对象等。我们如何遍历它们的内容? 对数组使用上面的任何选项 上面的至少一些(可能是大多数甚至全部)数组方法经常同样适用于类似数组的对象: 使用forEach及相关(ES5 +) 上的各种功能Array.prototype是“有意通用的”,通常可以通过Function#call或在类似数组的对象上使用Function#apply。(在此答案的末尾,请参阅警告,以了解主机提供的对象,但这是一个罕见的问题。) 假设您要forEach在Node的childNodes属性上使用。您可以这样做: Array.prototype.forEach.call(node.childNodes, function(child) { // Do something with `child` }); 如果要执行很多操作,则可能需要将函数引用的副本复制到变量中以供重用,例如: // (This is all presumably in some scoping function) var forEach = Array.prototype.forEach; // Then later... forEach.call(node.childNodes, function(child) { // Do something with `child` }); 使用一个简单的for循环 显然,一个简单的for循环适用于类似数组的对象。 正确使用for-in for-in具有与数组相同的保护措施,也应与类似数组的对象一起使用;上面#1中由主机提供的对象的警告可能适用。 使用for-of(隐式使用迭代器)(ES2015 +) for-of将使用对象提供的迭代器(如果有);我们将不得不看一下它如何与各种类似数组的对象一起运行,尤其是主机提供的对象。例如,NodeListfrom 的规范querySelectorAll已更新以支持迭代。HTMLCollectionfrom 的规格getElementsByTagName不是。 明确使用迭代器(ES2015 +) 参见#4,我们必须看看迭代器如何发挥作用。 创建一个真实的数组 其他时候,您可能希望将类似数组的对象转换为真正的数组。做到这一点非常容易: 使用slice数组的方法 我们可以使用slice数组的方法,就像上面提到的其他方法一样,它是“故意通用的”,因此可以与类似数组的对象一起使用,如下所示: var trueArray = Array.prototype.slice.call(arrayLikeObject); 因此,例如,如果我们要将a NodeList转换为真实数组,则可以执行以下操作: var divs = Array.prototype.slice.call(document.querySelectorAll("div")); 请参阅下面的警告,了解主机提供的对象。特别要注意的是,这将在IE8及更早版本中失败,这不允许您this像这样使用主机提供的对象。 使用传播语法(...) 还可以将ES2015的扩展语法与支持此功能的JavaScript引擎一起使用: var trueArray = [...iterableObject]; 因此,例如,如果我们想将a NodeList转换为真正的数组,使用扩展语法,这将变得非常简洁: var divs = [...document.querySelectorAll("div")]; 使用Array.from (规格) | (MDN) Array.from(ES2015 +,但很容易填充),从类似数组的对象创建数组,可以选择先将条目通过映射函数传递。所以: var divs = Array.from(document.querySelectorAll("div")); 或者,如果您想获取具有给定类的元素的标记名称的数组,则可以使用映射函数: // Arrow function (ES2015): var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName); // Standard function (since `Array.from` can be shimmed): var divs = Array.from(document.querySelectorAll(".some-class"), function(element) { return element.tagName; }); 警告主机提供的对象 如果您将Array.prototype函数与主机提供的类似数组的对象一起使用(DOM列表和浏览器而非JavaScript引擎提供的其他内容),则需要确保在目标环境中进行测试,以确保主机提供的对象行为正常。大多数(现在)确实表现正常,但是测试很重要。原因是Array.prototype您可能要使用的大多数方法都依赖于主机提供的对象,该对象为抽象[[HasProperty]]操作提供了诚实的答案。在撰写本文时,浏览器在这方面做得很好,但是5.1规范确实允许由主机提供的对象可能不诚实。在§8.6.2中,该部分开头附近的大表下方的几段中),其中表示: 除非另有说明,否则宿主对象可以以任何方式实现这些内部方法。例如,一种可能性是,[[Get]]和[[Put]]对特定宿主对象确实读取与存储的属性值但[[HasProperty]]总是产生假。 (我在ES2015规范中找不到等效的用法,但情况肯定仍然如此。)同样,在撰写本文时,现代浏览器中的主机提供的类似数组的对象(NodeList例如,实例)确实可以处理[[HasProperty]]正确,但是测试很重要。) 问题来源于stack overflow
保持可爱mmm 2020-01-08 11:20:24 0 浏览量 回答数 0

回答

一旦我回顾了对我而言至关重要的Haskell数组库的功能,并编译了一个比较表(仅电子表格:直接链接)。所以我会尽力回答。 我应该在什么基础上选择Vector.Unboxed和UArray?它们都是未装箱的数组,但Vector抽象似乎广为宣传,尤其是在循环融合方面。Vector总是更好吗?如果没有,我什么时候应该使用哪种表示形式? 如果需要二维或多维数组,则最好使用UArray而不是Vector。但是Vector有更好的API来处理向量。通常,Vector不太适合模拟多维数组。 Vector.Unboxed不能与并行策略一起使用。我怀疑不能同时使用UArray,但是至少很容易从UArray切换到盒装Array,看看并行化是否带来的好处超过了装箱成本。 对于彩色图像,我希望存储三位16位整数或三位单精度浮点数。为此,Vector或UArray是否更易于使用?表现更好? 我尝试使用数组表示图像(尽管我只需要灰度图像)。对于彩色图像,我使用Codec-Image-DevIL库读取/写入图像(绑定到DevIL库),对于灰度图像,我使用pgm库(纯Haskell)。 我对Array的主要问题是,它仅提供随机访问存储,但是它不提供许多构建Array算法的方法,也没有随便使用数组例程库(不与线性代数库接口,不允许表达卷积,fft和其他变换)。 几乎每次必须从现有阵列中构建一个新数组时,都必须构造一个中间值列表(就像Gentle Introduction 中的矩阵乘法一样)。数组构建的成本通常超过了更快的随机访问带来的好处,以至于在我的一些用例中,基于列表的表示更快。 STUArray可以为我提供帮助,但我不喜欢与神秘的类型错误以及使用STUArray编写多态代码所需的工作抗争。 因此,数组的问题在于它们不适用于数值计算。在这方面,Hmatrix的Data.Packed.Vector和Data.Packed.Matrix更好,因为它们带有固态矩阵库(注意:GPL许可证)。在性能方面,就矩阵乘法而言,hmatrix足够快(仅比Octave慢一些),但非常耗内存(比Python / SciPy消耗多倍)。 也有用于矩阵的blas库,但它不是基于GHC7建立的。 我对Repa并没有太多的经验,并且我不太了解repa代码。从我的角度来看,它可以使用的矩阵和数组算法的使用范围非常有限,但是至少可以通过该库来表达重要的算法。例如,已经存在用于矩阵乘法和用于 REPA算法中的卷积的例程。不幸的是,似乎卷积现在仅限于7×7内核(对我来说这还不够,但足以满足许多用途)。 我没有尝试过Haskell OpenCV绑定。它们应该很快,因为OpenCV确实非常快,但是我不确定绑定是否完整并且足够好以致于无法使用。而且,OpenCV本质上是非常必要的,充满破坏性的更新。我想很难在其上设计一个美观而有效的功能接口。如果采用OpenCV方式,他很可能会在任何地方使用OpenCV图像表示形式,并使用OpenCV例程对其进行操作。 对于双色调图像,每个像素仅需要存储1位。是否有预定义的数据类型可以通过将多个像素打包成一个单词来为我提供帮助,还是我自己? 据我所知,Unboxed的Bools数组负责打包和解包位向量。我记得在其他库中看过布尔数组的实​​现,在其他地方都没有看到。 最后,我的数组是二维的。我想我可以处理表示形式为“数组数组”(或向量的向量)带来的额外间接,但我更喜欢具有索引映射支持的抽象。谁能推荐标准库或Hackage中的任何内容? 除了Vector(和简单列表)之外,所有其他数组库都能够表示二维数组或矩阵。我想他们避免不必要的间接。
保持可爱mmm 2020-02-07 23:04:16 0 浏览量 回答数 0

回答

Array#each 为数组的每个元素执行给定的块,然后返回数组本身。 Array#map 也为数组的每个元素执行给定的块,但返回一个新数组,其值是该块每次迭代的返回值。 示例:假设您已经定义了一个数组: arr = ["tokyo", "london", "rio"] 然后尝试执行each: arr.each { |element| element.capitalize } => ["tokyo", "london", "rio"] 注意,返回值就是同一数组。each块内的代码被执行,但是不返回计算出的值;并且由于代码没有副作用,因此该示例没有做任何有用的工作。 相反,调用数组的map方法将返回一个新数组,其元素是执行该map块的每一轮的返回值: arr.map { |element| element.capitalize } => ["Tokyo", "London", "Rio"]
保持可爱mmm 2020-02-08 13:29:01 0 浏览量 回答数 0

问题

旋转数组的最小数字 6月22日 【今日算法】

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题11.旋转数组的最小数字。根据统计,在腾讯的算法面试环节出现频率较高,属于简单中等难度。 一、题目描述 把一个数组最开始的若干个元素搬...
游客ih62co2qqq5ww 2020-06-22 14:00:50 0 浏览量 回答数 0

回答

在clone数组上调用该方法时,它将返回对新数组的引用,该新数组包含(或引用)与源数组相同的元素。 因此,在您的示例中,int[] a是在堆上创建的单独的对象实例,并且int[] b是在堆上创建的单独的对象实例。(记住所有数组都是对象)。 int[] a = {1,2,3}; int[] b = a.clone(); System.out.println(a == b ? "Same Instance":"Different Instance"); //Outputs different instance 如果要修改,int[] b则更改将不会反映出来,int[] a因为这两个对象是单独的对象实例。 b[0] = 5; System.out.println(a[0]); System.out.println(b[0]); //Outputs: 1 // 5 当源数组包含对象时,这会变得稍微复杂一些。该clone方法将返回对新数组的引用,该数组引用与源数组相同的对象。 所以如果我们上课Dog... class Dog{ private String name; public Dog(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 然后创建并填充类型为Dog... 的数组 Dog[] myDogs = new Dog[4]; myDogs[0] = new Dog("Wolf"); myDogs[1] = new Dog("Pepper"); myDogs[2] = new Dog("Bullet"); myDogs[3] = new Dog("Sadie"); 然后克隆狗... Dog[] myDogsClone = myDogs.clone(); 数组引用相同的元素... System.out.println(myDogs[0] == myDogsClone[0] ? "Same":"Different"); System.out.println(myDogs[1] == myDogsClone[1] ? "Same":"Different"); System.out.println(myDogs[2] == myDogsClone[2] ? "Same":"Different"); System.out.println(myDogs[3] == myDogsClone[3] ? "Same":"Different"); //Outputs Same (4 Times) 这意味着,如果我们修改通过克隆数组访问的对象,则更改将在我们访问源数组中的同一对象时反映出来,因为它们指向相同的引用。 myDogsClone[0].setName("Ruff"); System.out.println(myDogs[0].getName()); //Outputs Ruff 但是,对数组本身的更改只会影响该数组。 myDogsClone[1] = new Dog("Spot"); System.out.println(myDogsClone[1].getName()); System.out.println(myDogs[1].getName()); //Outputs Spot // Pepper 如果您通常了解对象引用的工作方式,那么很容易理解克隆和修改如何影响对象数组。为了进一步了解参考文献和原语,建议您阅读这篇出色的文章。
保持可爱mmm 2020-02-09 14:02:04 0 浏览量 回答数 0

回答

以下为个人猜想没有确切的理论依据: push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。 根据MDN的说法理解,push方法应该是根据数组的length来根据参数给数组创建一个下标为length的属性,我们可以做以下测试: 根据这个测试我们发现,push方法影响了数组的length属性和对应下标的值。 在对象中加入splice属性方法,和length属性后。这个对象变成一个类数组。 我们使用题目中的代码时得到了这个结果: 这个时候控制台输出的是一个数组,但是实际上它是一个伪数组,并没有数组的其他属性和方法,我们可以通过这种方法验证: 所以我认为题目的解释应该是: 使用第一次push,obj对象的push方法设置 obj[2]=1;obj.length+=1使用第二次push,obj对象的push方法设置 obj[3]=2;obj.length+=1使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为数组进行打印打印时因为数组未设置下标为 0 1 处的值,故打印为empty,主动 obj[0] 获取为 undefined 第一第二步还可以具体解释为:因为每次push只传入了一个参数,所以 obj.length 的长度只增加了 1。push方法本身还可以增加更多参数,详见 MDN
九旬 2020-05-24 11:49:10 0 浏览量 回答数 0

问题

cxf实现webservice时候数组和list的问题

我在用cxf实现webservice时候,接口中的一个参数是数组,返回的是pojo类,pojo类里面也有一个数组,然后我发布了这个接口,再用利用wsdl和wsdl2jav...
长安归故里. 2020-01-08 16:31:31 0 浏览量 回答数 1

问题

一维或二维阵列,更快些?

我需要表示一个2D字段(轴x,y),并且遇到一个问题:我应该使用一维数组还是二维数组? 我可以想象,重新计算1D数组(y &#...
保持可爱mmm 2020-02-09 13:47:35 0 浏览量 回答数 1

问题

为什么C#多维数组不实现IEnumerable <T>?

我刚刚注意到C#中的多维数组没有实现IEnumerable ,但是实现了IEnumerable。对于一维数组,这两个IEnumerable 和IEnumerable来实现。 ...
保持可爱mmm 2020-02-09 11:59:53 0 浏览量 回答数 1

回答

要访问array或object您如何使用两个不同的运算符。 数组 要访问数组元素,您必须使用,[]或者您不会看到太多,但也可以使用is {}。 echo $array[0]; echo $array{0}; //Both are equivalent and interchangeable 声明数组与访问数组元素之间的区别 定义数组和访问数组元素是两件事。所以不要把它们混在一起。 要定义一个数组,可以使用array()或对于PHP> = 5.4 []并分配/设置一个数组/元素。当您使用[]或{}如上所述访问数组元素时,将获得与设置元素相反的数组元素的值。 // 声明一个数组 $ arrayA = array( / 这里有一些东西 / ) ; $ arrayB = [ / 这里有一些东西 / ];//仅适用于PHP> = 5.4 // 访问数组元素 echo $ array [ 0 ] ; 回声$ array { 0 } ; 访问数组元素 要访问数组中的特定元素,可以使用内部的任何表达式,[]或者{}将其求值为要访问的键: $ array [ (任何表达式) ] 因此,请注意使用什么表达式作为键,以及如何通过PHP对其进行解释: echo $ array [ 0 ]; //键是一个整数;它访问0的元素 echo $ array [ “ 0” ]; //键是一个字符串;它访问0的元素 echo $ array [ “ string” ]; //键是一个字符串;它使用键“ string”访问元素 echo $ array [ CONSTANT ]; //键是一个常量,它被替换为对应的值 echo $ array [ cOnStAnT ]; //键也是常量而不是字符串 echo $ array [ $ anyVariable ] //键是一个变量,它被替换为'$ anyVariable'中的值 echo $ array [ functionXY() ]; //键将是函数 的返回值 访问多维数组 如果彼此之间有多个数组,则只需一个多维数组。要访问子数组中的数组元素,只需使用multiple即可[]。 echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"] // ├─────────────┘ ├──────────────┘ ├────────────────────────────┘ // │ │ └── 3rd Array dimension; // │ └──────────────────── 2d Array dimension; // └───────────────────────────────────── 1st Array dimension; 对象 要访问对象属性,必须使用->。 echo $ object- >属性; 如果在另一个对象中有一个对象,则只需使用多个->即可获得对象属性。 echo $objectA->objectB->property; 注意: 另外,如果您使用的属性名称无效,也必须小心!因此,要查看所有问题,您可能会遇到一个无效的属性名称,请参阅此问题/答案。如果您在属性名称的开头有数字,则尤其要注意这一点。 您只能从班级外部访问具有公共可见性的属性。否则(私有或受保护的),您需要一个方法或反射,您可以使用该方法或反射来获取属性的值。 数组与对象 现在,如果您将数组和对象彼此混合在一起,则只需查看是否现在访问数组元素或对象属性并为其使用相应的运算符即可。 //宾语 echo $ object-> anotherObject-> propertyArray [“ elementOneWithAnObject”]-> property; //├────┘├──────────┘├─────────────├─────────── ───────┘├──────┘ //││││└──属性; //│││└────────────────────────数组元素(对象);使用->访问属性“ property” //││└──────────────────────数组(财产);使用[]访问数组元素'elementOneWithAnObject' //│└──────────────────────────── ────────────属性(对象);使用->访问属性'propertyArray' //└────────────────────────────── ───────────────────对象;使用->访问属性“ anotherObject” //数组 echo $ array [“ arrayElement”] [“ anotherElement”]-> object-> property [“ element”]; //├───┘├──────────┘├────────────┘├────┘├────── ├├───────┘ //│││││└──数组元素; //││││└────────────属性(数组);使用[]访问数组元素'element' //│││└────────────────────属性(对象);使用->访问属性“ property” //││└────────────────数组元素(对象);使用->访问属性“对象” //│└──────────────────────────── ────────数组元素(array); 使用[]访问数组元素'anotherElement' //└────────────────────────────── ─────────────数组 使用[]访问数组元素'arrayElement' 我希望这给您一个大概的想法,当它们相互嵌套时如何访问数组和对象。 注意: 是否调用数组或对象取决于变量的最外部。所以[new StdClass]是一个阵列,即使它已(嵌套)对象内的,并$object->property = array();是一个对象,即使它已(嵌套)阵列内。 并且,如果不确定是否有对象或数组,请使用gettype()。 如果有人使用您以外的其他编码样式,请不要感到困惑: //Both methods/styles work and access the same data echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property; echo $object-> anotherObject ->propertyArray ["elementOneWithAnObject"]-> property; //Both methods/styles work and access the same data echo $array["arrayElement"]["anotherElement"]->object->property["element"]; echo $array["arrayElement"] ["anotherElement"]-> object ->property["element"]; 数组,对象和循环 如果您不仅要访问单个元素,还可以遍历嵌套的数组/对象并遍历特定维的值。 为此,您只需要访问要循环的维度,然后就可以循环浏览该维度的所有值。 作为示例,我们采用一个数组,但它也可以是一个对象: Array ( [data] => Array ( [0] => stdClass Object ( [propertyXY] => 1 ) [1] => stdClass Object ( [propertyXY] => 2 ) [2] => stdClass Object ( [propertyXY] => 3 ) ) ) 如果在第一个维度上循环,则将从第一个维度获取所有值: foreach($ array as $ key => $ value) 这意味着在第一维中,您只有一个带有key($key)data和value($value)的元素: Array ( //Key: array [0] => stdClass Object ( [propertyXY] => 1 ) [1] => stdClass Object ( [propertyXY] => 2 ) [2] => stdClass Object ( [propertyXY] => 3 ) ) 如果在第二维上循环,则将从第二维获取所有值: foreach($ array [“ data”] as $ key => $ value) 在这里意味着在第二个维度你有3个元素与键($key)0,1,2和值($value): stdClass Object ( //Key: 0 [propertyXY] => 1 ) stdClass Object ( //Key: 1 [propertyXY] => 2 ) stdClass Object ( //Key: 2 [propertyXY] => 3 ) 这样,您就可以遍历任何维,无论它是数组还是对象。 分析var_dump()/ print_r()/ var_export()输出 所有这三个调试功能都输出相同的数据,只是以另一种格式或带有一些元数据(例如,类型,大小)。因此,在这里我想展示如何读取这些函数的输出,以了解/了解如何从数组/对象访问某些数据。 输入数组: $array = [ "key" => (object) [ "property" => [1,2,3] ] ]; var_dump() 输出: array(1) { ["key"]=> object(stdClass)#1 (1) { ["property"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } } } print_r() 输出: Array ( [key] => stdClass Object ( [property] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) ) var_export() 输出: array ( 'key' => stdClass::__set_state(array( 'property' => array ( 0 => 1, 1 => 2, 2 => 3, ), )), ) 因此,您可以看到所有输出都非常相似。而且,如果现在要访问值2,则可以从值本身开始,您要访问该值,然后逐步到达“左上角”。 1.我们首先看到,值2在键为1的数组中 array(3){ // var_dump() [0] => 整数(1) [1] => 整数(2) [2] => 整数(3) } 数组 // print_r() ( [0] => 1 [1] => 2 [2] => 3 ) 数组( // var_export() 0 => 1 1 => 2 2 => 3, ), 这意味着我们必须使用[]/ {}来访问值2 [1],因为该值具有键/索引1。 2.接下来,我们看到将数组分配给具有对象名称属性的属性 对象(stdClass)#1(1){ // var_dump() [“ property”] => / 此处数组 / } stdClass 对象 // print_r() ( [property] => / 此处为数组 / ) stdClass :: __ set_state ( array(// var_export() 'property' => / 此处数组 / )) 这意味着我们必须使用->访问对象的属性,例如->property。 所以直到现在我们知道,我们必须使用->property[1]。 3.最后,我们看到最外面的是一个数组 array(1){ // var_dump() [“ key”] => / 对象和数组在这里 / } 数组 // print_r() ( [key] => / 对象和数组在这里 / ) 数组( // var_export() 'key' => / 对象和数组在这里 / ) 如我们所知,我们必须使用来访问数组元素[],我们在这里看到我们必须使用["key"]来访问对象。现在,我们可以将所有这些部分放在一起并编写: echo $array["key"]->property[1]; 输出将是: 2 不要让PHP欺骗您! 您需要了解一些事情,这样您就不必花费大量时间来寻找它们。 “隐藏”字符 有时,您的按键中包含字符,这些字符在浏览器的第一次外观中不会出现。然后您要问自己,为什么无法访问该元素。这些字符可以是:标签(\t),新线(\n),空格或HTML标签(例如, )等。 作为示例,如果您查看的输出,print_r()则会看到: Array ( [key] => HERE ) 然后,您尝试通过以下方式访问元素: echo $arr["key"]; 但是您会收到通知: 注意:未定义的索引:键 这很好地表明必须有一些隐藏的字符,因为即使键看起来很正确,也无法访问该元素。 这里的技巧是使用var_dump()+查看源代码!(备选:highlight_string(print_r($variable, TRUE));) 突然之间,您可能会看到以下内容: array(1) { [" key"]=> string(4) "HERE" } 现在您将看到,您的键中带有一个html标记+一个换行符,这是您最初没有看到的,因为print_r()浏览器没有显示它。 所以现在,如果您尝试执行以下操作: echo $arr["\nkey"]; 您将获得所需的输出: HERE 永远不要相信XML 的输出,print_r()或者var_dump()如果您看XML 您可能将XML文件或字符串加载到对象中,例如 现在,如果您使用var_dump()或,print_r()您将看到: SimpleXMLElement Object ( [item] => SimpleXMLElement Object ( [title] => test ) ) 如您所见,您看不到标题的属性。因此,正如我说永远不要相信的输出var_dump()或print_r()当你有一个XML对象。始终用于asXML()查看完整的XML文件/字符串。 因此,只需使用下面显示的方法之一: echo $xml->asXML(); //And look into the source code highlight_string($xml->asXML()); header ("Content-Type:text/xml"); echo $xml->asXML(); 然后您将获得输出:
保持可爱mmm 2020-02-09 14:02:47 0 浏览量 回答数 0

回答

试试用正则表达式匹配。。###### 这种小事不要问别人,可以先写好解决问题的步骤,工作中遇到的小问题很多,要自己思考解决问题的具体步骤和方法,只要有了思路,用任何编程语言都可以解决,我在面试的时候只要能给出解决方案就行,具体代码无所谓, 例如: 第一步:把文件逐行读到一个数组中,每行对应一个数组元素, 第二步:处理整个数组, 第三步:等等, 好不好,是否优雅,无所谓,只要解决问题就行,关键自己要有思路,不能死板的问别人,自己都不愿意动脑子,谁愿意给你加工资, 试试用正则表达式匹配。。###### 这种小事不要问别人,可以先写好解决问题的步骤,工作中遇到的小问题很多,要自己思考解决问题的具体步骤和方法,只要有了思路,用任何编程语言都可以解决,我在面试的时候只要能给出解决方案就行,具体代码无所谓, 例如: 第一步:把文件逐行读到一个数组中,每行对应一个数组元素, 第二步:处理整个数组, 第三步:等等, 好不好,是否优雅,无所谓,只要解决问题就行,关键自己要有思路,不能死板的问别人,自己都不愿意动脑子,谁愿意给你加工资,
kun坤 2020-06-08 14:48:10 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务