我有一个简单的代码,它接收一个2d数组(使用getValues从Google表格中获取的交货报告)作为输入,根据某些条件对项目进行计数并将这些计数推入另一个数组。
2d输入数组(交货报告)中的每个元素都由带有与两种可能类型的已交货项目有关的信息的vendorID组成。交付的每个项目都是一个单独的元素(报告上的单独行),即使对于相同的供应商ID也是如此。
vendorID1-项目-项目信息
vendorID1-项目-项目信息
vendorID1-项目-项目信息
vendorID2-物料-物料信息
vendorID2-物料-物料信息
...等等。
我的代码通过使用外部For循环从报告(数组[0] [0])中读取第一个vendorID来工作,然后遍历数组以使用内部For循环来寻找匹配的vendorID-如果满足Condition1,则递增Item1乘以1,如果满足Condition2,则将Item2乘以1。然后将(vendorID,Item1_count,Item2_count] []推入另一个数组。
我遇到的问题是,外循环的每次迭代最终都会将多个重复记录推入最终数组,因为输入数组(交付报告)中的每个供应商ID几乎总是有多个条目对应于每个交付的物品。
我需要找出一种跳过或忽略已计算的供应商ID的方法,以避免将相同的数据推入最终数组。
最初,我的代码将数据推送到一维数组中,并且我能够使用indexOf检查是否已推送了供应商ID,但是我更改了代码以创建2d数组,以实现更好的数据组织和indexOf作品。我想出了另一种解决方法,但是我不知道这是否是最好的解决方案,因为我是编码的新手。 我的另一种解决方案是创建另一个数组来保存已经计算的供应商ID,然后在该数组上使用indexOf来防止推送重复的条目。
任何帮助将不胜感激!
代码如下:
// Iterate through the array to get first/next vendorID on the list
for (var i=0; i<delivery_data.length; i++) {
// Assign vendorID from input array (delivery report) to a variable
var vendor_id = delivery_data[i][0];
// Declare a variable to eventually hold vendorID counted last
var last_counted_vendor;
// Set item counts to 0
var item1_count = 0;
var item2_count = 0;
// Execute inner For loop only if
// vendorID is not the same as previous iteration
if (vendor_id != last_counted_vendor) {
// I think j=i works and avoids searching from the
// beginning of the array every singe time
for (var j=i; j<delivery_data.length; j++) {
// If vendorID matches and condition1 is met, increment item1
if (vendor_id == delivery_data[j][0] && condition1) {
item1_count++;
}
// If vendorID matches and condition2 is met, increment item2
else if (vendor_id == delivery_data[j][0] && condition2) {
item2_count++;
}
}
// Assign vendorID just counted to a variable
last_counted_vendor = vendor_id;
// Push vendorID and item counts to the final array
count_data.push([vendor_id,item1_count,item2_count]);
}
}
答案 0 :(得分:2)
最简单的方法是到目前为止找到true
个$fisier = file_get_contents('urlproxy'); // Read the file with the proxy list
$linii = explode("\n", $fisier); // Get each proxy
$fisier = fopen("bune.txt", "a"); // Here we will write the good ones
,如果找到的Set
已包含在{{1 }}:
vendor_id
答案 1 :(得分:1)
看起来您不必要地遍历了两次数组。对元素进行计数的一种典型方法是创建一个哈希映射,该映射将您的计数键控为某个ID。
换句话说,您将构建一个看起来像这样的对象:
class ViewModel {
let inputs: [AnyObserver<String>]
let outputs: [Observable<String>]
init(count: Int) {
let subjects = (0..<count).map { _ in BehaviorSubject<String>(value: "") }
inputs = subjects.map { $0.asObserver() }
outputs = subjects.map { $0.asObservable() }
}
}
class ParentViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let bag = self.bag
Observable.just(viewModel.inputs)
.bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { _, element, cell in
let textField = cell.viewWithTag(99) as! UITextField
textField.rx.text.orEmpty
.bind(to: element)
.disposed(by: bag)
}
.disposed(by: bag)
}
let bag = DisposeBag()
}
class ChildViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let bag = self.bag
Observable.just(viewModel.outputs)
.bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { _, element, cell in
element
.bind(to: cell.textLabel!.rx.text)
.disposed(by: bag)
}
.disposed(by: bag)
}
let bag = DisposeBag()
}
然后在map = {
id1: [id, count1, count2],
id2: [id, count1, count2]
}
没有特定键的情况下循环遍历,这是您第一次看到它,并添加了数组并递增。如果确实存在,则只需增加所需的内容即可。
这是一个包含一些虚假数据的示例,其条件只是设置了map
还是item info[1]
。最后,item info[2]
可以返回一个简单的计数数组:
Object.values
这使您的算法以线性时间而不是多项式时间运行,这几乎在所有情况下都会更快。