我有一个Perl脚本,它嵌套foreach循环,如下所示.这需要很长时间:
#! /usr/bin/perl
use strict;
use warnings;
my @sites = ('a', 'b', 'c');
my @servers = ('A', 'B');
my @data_type = ("X", "Y", "Z");
foreach my $site (@sites) {
foreach my $server_type (@servers) {
foreach my $data (@data_type) {
#statements
}
}
}
Run Code Online (Sandbox Code Playgroud)
foreach像这样的嵌套语句需要很长时间,而且很难阅读而且不是很漂亮.谁能建议一个更好的方法来使用哈希或其他一些聪明的结构来编码这个结构?
我目前正在编写一个程序,需要比较可变大小的ArrayList中的每个文件.现在,我这样做的方式是通过嵌套的代码循环:
if(tempList.size()>1){
for(int i=0;i<=tempList.size()-1;i++)
//Nested loops. I should feel dirty?
for(int j=i+1;j<=tempList.size()-1;j++){
//*Gets sorted.
System.out.println(checkBytes(tempList.get(i), tempList.get(j)));
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些关于嵌套循环必要性的不同意见,我想知道是否有人有更高效的替代方案.
乍看之下,无论哪种方式都需要进行每次比较,因此性能应该相当稳定,但我还是有点确信有一种更清洁的方法可以做到这一点.有什么指针吗?
编辑::为清晰起见,这只是功能的一部分.这些文件已根据长度进行比较并放入存储桶中 - 在浏览完集合的映射后,找到一个长度大于1的存储桶,它会运行它.所以 - 这些都是相同大小的文件.在我得到字节之前,我将进行校验和比较,但是现在我只是想清理循环.
此外,圣母这个网站反应迅速.多谢你们.
EDIT2 ::对不起,为了进一步说明:文件处理部分我有一个很好的把握,我认为 - 首先,我按长度进行比较和排序,然后通过校验和,然后按字节 - 我的问题是如何正确处理需要有效地比较ArrayList中的所有文件,假设它们都需要进行比较.如果一个嵌套循环就足够了,那很酷,我只想检查这是一个合适的方法,按惯例.
我是Python的初学者,尝试过几个程序.我有类似Python中的以下WHILE循环结构(不完全相同).
IDLE 2.6.4
>>> a=0
>>> b=0
>>> while a < 4:
a=a+1
while b < 4:
b=b+1
print a, b
1 1
1 2
1 3
1 4
Run Code Online (Sandbox Code Playgroud)
我期待外循环遍历1,2,3和4.我知道我可以用这样的FOR循环来做这个
>>> for a in range(1,5):
for b in range(1,5):
print a,b
1 1
1 2
.. ..
.. .. // Other lines omitted for brevity
4 4
Run Code Online (Sandbox Code Playgroud)
但是,WHILE循环有什么问题?我想我错过了一些显而易见的事情,但无法理解.
答案: 纠正的WHILE循环..
>>> a=0
>>> b=0
>>> while a < 4:
a=a+1
b=0
while b<4:
b=b+1
print a,b
1 1
.. .. …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个像这样的迭代器,用于注释列表:
// the iterator class, pretty much the same as the one from the php docs...
abstract class MyIterator implements Iterator{
public $position = 0,
$list;
public function __construct($list) {
$this->list = $list;
$this->position = 0;
}
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->list[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->list[$this->position]);
}
}
Run Code Online (Sandbox Code Playgroud)
评论迭代器:
class MyCommentIterator extends MyIterator{ …Run Code Online (Sandbox Code Playgroud) 我记得变量是Javascript中的函数作用域.但是,如果我在循环中重新定义局部变量,行为如何.一个常见的用例是嵌套循环.在下面的代码中,如果我将j更改为i,则外部for循环在一次迭代后终止,因为外部作用域中的i值与内部for循环相同.由于我使用var,我期待(类似于其他语言)它在内部fo循环中被重新定义.这是否意味着在JS中,没有办法在函数范围内重新声明和使用局部变量.
for (var i = 0, len = x.length; i < len; i++) {
...
for (var j = 0, len = y.length; j < len; j++) {
...
}
}
Run Code Online (Sandbox Code Playgroud) 我想查看按部门分组的一些联系信息(姓名,电子邮件,...),但我无法通过Handlebars实现.
X部门
Y部门
我不知道我提前有多少个部门.因此,在我的控制器中,我尝试在Ember.Map中加载信息,其中部门是其键,而带有联系人信息的数组是每个部门的值.它是这样的:
map = Ember.Map.create();
// Load data from server into map
// m = {'Department X': [{name:'x1','email':'emailx1',...},{...}], 'Department Y':[....], ...}
{{#each department in map}}
{{department}}
{{#each contact in map.keys}}
{{contact.name}} | {{contact.email}}
{{#each}}
{{#each}}
Run Code Online (Sandbox Code Playgroud)
抛出一个错误,说"EmberCollectionView的内容必须实现Ember.Array.你传递了[object Object]".是否可以通过嵌套数据实现suh任务?欢迎任何帮助.谢谢.
for(i=0; i<n; i++)
{
a[i]=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
a=3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个三重嵌套循环.我的书指出运行时间是:O(N)+ O(N ^ 2)= O(N ^ 2)
不应该是O(N ^ 3)?所有3个循环都相互依赖.它将运行N*N*N次.
我试图得到一个像这样的结果:Miniors | Boys | 54kg - 62kg由管道分隔的每个值 来自包含某种"限制类型"的数组.例如:( ageGroups, genders, weightClasses如上所示).
我现在能够得到这个结果的方法是,如果我硬编码嵌套的forEach循环(使用underscorejs),但这意味着我现在必须循环多少个数组以获得想要的结果.这工作"很好":
var categories = [];
_.each(ageGroups, function(ageGroup) {
_.each(gender, function(gender) {
_.each(weightClasses, function(weightClass) {
categories.push(ageGroup.name + ' | ' + gender.name + ' | ' + weightClass.name);
});
});
});
Run Code Online (Sandbox Code Playgroud)
输出是一个数组(类别),包含限制数组的所有可能组合.
现在,我的问题是我需要一种方法来对未知数量的限制数组做同样的事情.我对一个正确的解决方案的猜测是递归,但我还没有能够产生任何实际工作的东西,因为我还没有能够绕着递归包裹:)
可以在这里找到一些用一些测试数据准备的小提琴:jsFiddle.小提琴使用angular来进行一些简单的数据绑定和调试结果输出和下划线来处理数组.
我试图想出一种方法,用20个字符的字母表生成所有可能的唯一字符串,其中字符串中的顺序无关紧要,字符串的长度可以变化.因此,例如,对于长度为3的字符串,可能串会AAA,AAB,AAC等,但不包括BAA或CAA.我想出了一种使用方式itertools.product(),但它的计算成本非常高.最简单的方法是使用嵌套的for循环.例如,要生成长度为4的所有字符串:
alphabet = ["A","C","D","E","F","G","H","I","K","L",
"M","N","P","Q","R","S","T","V","W","Y"]
combos = []
for a in range(len(alphabet)):
for b in range(a,len(alphabet)):
for c in range(b,len(alphabet)):
for d in range(c,len(alphabet)):
combos.append(alphabet[a] + alphabet[b] + alphabet[c] + alphabet[d])
Run Code Online (Sandbox Code Playgroud)
现在,通过更改for循环的数量,可以轻松地对任何长度字符串进行此操作.鉴于for循环序列本身是可以预测的,有没有办法简化这个代码,而不是if length == 3运行三个for循环并if length == 4运行四个循环?我现在能想到的唯一方法就是一堆if-elif陈述:
if length == 3:
for a in range(len(alphabet)):
for b in range(a,len(alphabet)):
for c in range(b,len(alphabet)):
combos.append(alphabet[a] + alphabet[b] + alphabet[c])
elif length == …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试解决ProjectEuler问题,除了速度之外,我已经解决了所有问题.我几乎可以肯定程序执行速度这么慢的原因是由于嵌套循环.我会喜欢一些关于如何提高速度的建议.我是一名新手程序员,所以我不熟悉很多更高级的方法/主题.
public class Problem12 {
public static void main(String[] args) {
int num;
for (int i = 1; i < 15000; i++) {
num = i * (i + 1) / 2;
int counter = 0;
for (int x = 1; x <= num; x++) {
if (num % x == 0) {
counter++;
}
}
System.out.println("[" + i + "] - " + num + " is divisible by " + counter + " numbers."); …Run Code Online (Sandbox Code Playgroud) nested-loops ×10
for-loop ×2
java ×2
javascript ×2
loops ×2
python ×2
arrays ×1
c ×1
class ×1
ember.js ×1
iterator ×1
nested ×1
oop ×1
performance ×1
perl ×1
php ×1
python-3.x ×1
recursion ×1
while-loop ×1