按照课程思路完成后的更简洁的版本

按照课程思路完成后的更简洁的版本

每次看完好几节视频后自己会按照老师的思路来写代码,感觉自己懂了写完代码还是跟老师代码有区别的,SKU这段逻辑看了之后并不是很懂,知道了思路,也记不住老师的代码,自己写完后对比又看了一遍视频,才完全懂了。在写代码过程中发现有些细节其实不用考虑(其实是到这里忘了老师具体怎样处理的,只知道思路)。

在judge中仍然只做两件事,更改当前cell状态和设置其他cell状态
http://img1.sycdn.imooc.com//climg/5dd546b00920bfbc11560272.jpg

先看设置其他cell状态的方法,对fences遍历,然后每次只拿到当前遍历的这个cell的潜在路径,看看是否存在,这里就与老师的思路有些许差异,这里没有纠结当前行选中的玄素,而是直接略过所有已选元素,对不是已选的元素进行wating和forbidden的设置,因为不管怎样,这里主要的目的是找潜在路径,已选的元素是可以不用处理的。
http://img1.sycdn.imooc.com//climg/5dd5497909e30e9811721346.jpg

再看设置当前元素的状态,对于老师的思路就是在加了pendingCell里加了一个清楚已选的方法,因为每行同时只能选择一个,所以当选中一个的时候其他选中的要恢复wating状态,这里是不会从seleted直接切换到forbidden的,所以是可行的。里面第一句return是对有默认规格情况的处理,如果有默认规格,这个代码直接返回不执行

http://img1.sycdn.imooc.com//climg/5dd54ae20939f22412220346.jpg
http://img1.sycdn.imooc.com//climg/5dd54b4909b8e43611880820.jpg

在看完默认规格的处理之后,这里的处理相对来说也更简洁一点,设置默认的sku,就去除默认sku的specs转换为Cell对象,因为specs是有顺序的,而且顺序跟我们设置的规格名顺序是一致的,这就可以直接确定每个cell是哪一行的,就好操作了,所以根据id值遍历一遍cells,将符合条件的cell(是在fenceGroup中的cell,所有操作status的cell都是fenceGroup中的cell)插入到pendingCell中,就完成了默认规格的设置,在constructor中执行方法以及jude就好了。

http://img1.sycdn.imooc.com//climg/5dd54c7909814a7600000000.jpg

结果是没出错的

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
7七月 2019-11-21 09:34:28

SKU这块其实我给了思路后,基本就差不多了。细节处理上可能有差异,但都是建立在同一个思路上,这个影响不大。不可能有本质的改变了,除非是完全不同的思路。

  • 提问者 king帅帅 #1
    ₍ᐢ •⌄• ᐢ₎嗯嗯
    2019-11-21 09:49:31
7七月 2019-11-21 01:19:57

我有个问题是,你这个算法可以不管其他行的已选元素?当前行的已选元素我记得我也没有别处理吧?

  • 提问者 king帅帅 #1
    ?描述有误,是那个查找当前行已选元素的潜在路径时候专门对当前行已选元素进行了判断,直接返回,juge里判断了!path不做处理。我这里所有元素都寻找了潜在路径,设置forbidden与wating的时候就跳过selected的cell,这就自动包涵了当前行已选元素,其他行已选元素也自动跳过了。emmm...写代码的时候考虑了老师讲到的问题,但似乎没有做太复杂的思考,有些地方想的比视频里少,可能看完了整个思路才写的,一些地方细节处理跟老师不是完全一样的,写完后发现好像没见到老师讲的那个专门处理当前行选中元素的状态(σ゚∀゚)σ 。还有那个处理当前行同时选中的时候就做了个恢复当前行之前选中元素的状态的处理,没写很多代码(⌯꒪꒫꒪)੭ु⁾⁾,主要是看完自己写的时候很多细节之处记得有,但是具体如何写的记不清,就自己按自己的想法去处理了
    2019-11-21 07:39:44
  • 提问者 king帅帅 #2
    洗了把脸,洗脸的时候一直在想这两份代码,突然发现他们似乎是一样的,只是处理细节的时机不太一样
    2019-11-21 07:53:57
  • 提问者 king帅帅 #3
    其实触发细节差异的原因应该是我找了对应元素的潜在路径以后先想到的是如果别的行有元素已选,他也有潜在路径,我如果直接设置为wating那就把前面设置的已选给毁了,那我就跳过这些已选的,然后想到老师似乎对当前行已选做过专门判断我这里该怎么判断,但回头一看我跳过已选的时候这个问题就已经处理了,就不用再判断了。 另一处同行元素处理的时候在想pending中存的元素状态没改,造成同行选中问题的原因不就是它之前是已选,现在不是了,但它不是的时候还保持高高在上的已选状态,每行pending交椅只有一把,那另一个上台的时候他就该下台,所以就下台前先恢复状态,这样处理要求就是在pending中存储的元素也必须是fenceGroup下的cell 这样顺理成章就想到处理默认sku,只要按id找到fenceGroup中对应刚的选中元素,给他们状态设置为selected,把它推上pending的交椅之上,就可以了。 这里的前置条件就是设置已选元素的时候判断已选元素应该是从pending中找,就跟第一段描述形成了闭环。 当然,这一切都要求处理status必须是对fenceGroup里的cell,pending里保存的cell也必须是fenceGroup的cell
    2019-11-21 08:13:05
提问者 king帅帅 2019-11-20 22:34:33

上述表述中有些错别字,影响阅读的最后一段的第一行“就去把默认sku的spec转换为....”,最后一段忘记说明,在插入pendingCell之前要将cell状态改为selected已选状态

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师