【问题标题】:How to select element and surrounding elements from array, preferring return array with selected element in middle?如何从数组中选择元素和周围元素,更喜欢返回数组,中间选择元素?
【发布时间】:2016-08-31 17:19:12
【问题描述】:

initial_array = (1..10).to_a.

我需要它在数字选择上是动态的,但举个例子:我需要选择数字5,以及两边的两个元素。理想情况下,这将返回:[3,4,5,6,7]

我知道我可以使用each_cons 来返回所需的数组长度以及周围的数字。但是,要选择所需的元素,我目前使用的是initial_array.each_cons(5).find {|ary| ary.include?(5)}

这将返回[1,2,3,4,5],而不是所需的[3,4,5,6,7]

此外,我希望该函数在频谱的两端都有效,返回的数组的长度始终为5,除非initial_array.length < 5,此时returned_array.length == intial_array.length

因此,initial_array.solution_method(1) 返回 [1,2,3,4,5]

initial_array.solution_method(10) 返回[6,7,8,9,10]

[1,2,3,].solution_method(2) 返回[1,2,3]

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    这不是一个单行但可能更容易理解?

    input = (1..10)
    
    def select_range(array, num, range)
      index = array.index(num) # find the value
      return [] if !index # return if the array doesn't include it
    
      array[(index - range)..(index + range)] # return the range of elements
    end
    
    p select_range(input.to_a, 5, 2)
    

    输出:

    [3, 4, 5, 6, 7]
    

    【讨论】:

    • 非常适合阵列中间!但是,如果num <= 2,由于返回数组的索引为负,返回[]。如果num >= 9,则返回一个较短的数组,因为array[index + range] 不存在。
    • 对数组边界之外的范围有什么期望?它会截断吗?最后是否需要完全是范围长度?在我们编写更多代码之前,您可能需要定义一些极端情况。
    • 试图在编辑中解决。 return_ary.length == init_ary.length if init_ary.length < 5
    • if init_ary.index(num) < 2 return_ary.index(num) 0 或 1,长度仍为 5(除非上述情况),尾随数字
    • elsif init_ary.index(num) > init_ary.length - 2 return_ary.index(num) 3 或 4,长度仍为 5,num 之前的数字更多
    【解决方案2】:
    def grab_part(arr, nbr, option=:avg)
      return nil unless (1..arr.size).include?(nbr)
      return nil if option!=:avg && !(nbr-1...arr.size).include?(option)
      first = (option==:avg) ? (arr.size-nbr)/2 : option-nbr+1
      arr[first,nbr]
    end
    

    nbr 是要返回的数组的大小。 option==:avg 如果要返回arr 的“中间”;否则optionarr 的索引,标识要返回的数组的最后一个元素。

    arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    grab_part(arr,5)   #=> [3, 4, 5, 6, 7]
    grab_part(arr,5,9) #=> [6, 7, 8, 9, 10]
    grab_part(arr,5,4) #=> [1, 2, 3, 4, 5]
    

    下面是grab_part的第二个参数的其他值的返回值。

    (1..arr.size).map do |n|
      next if n==5
      puts "grab_part(arr,#{n}) \#=> #{ grab_part(arr,n) }" 
      puts "grab_part(arr,#{n},#{arr.size-1}) \#=> #{grab_part(arr,n,arr.size-1)}"
      puts "grab_part(arr,#{n},#{n-1}) \#=> #{grab_part(arr,n,n-1)}\n"
    end
    grab_part(arr,1)    #=> [5]
    grab_part(arr,1,9)  #=> [10]
    grab_part(arr,1,0)  #=> [1]
    grab_part(arr,2)    #=> [5, 6]
    grab_part(arr,2,9)  #=> [9, 10]
    grab_part(arr,2,1)  #=> [1, 2]
    grab_part(arr,3)    #=> [4, 5, 6]
    grab_part(arr,3,9)  #=> [8, 9, 10]
    grab_part(arr,3,2)  #=> [1, 2, 3]
    grab_part(arr,4)    #=> [4, 5, 6, 7]
    grab_part(arr,4,9)  #=> [7, 8, 9, 10]
    grab_part(arr,4,3)  #=> [1, 2, 3, 4]
    grab_part(arr,6)    #=> [3, 4, 5, 6, 7, 8]
    grab_part(arr,6,9)  #=> [5, 6, 7, 8, 9, 10]
    grab_part(arr,6,5)  #=> [1, 2, 3, 4, 5, 6]
    grab_part(arr,7)    #=> [2, 3, 4, 5, 6, 7, 8]
    grab_part(arr,7,9)  #=> [4, 5, 6, 7, 8, 9, 10]
    grab_part(arr,7,6)  #=> [1, 2, 3, 4, 5, 6, 7]
    grab_part(arr,8)    #=> [2, 3, 4, 5, 6, 7, 8, 9]
    grab_part(arr,8,9)  #=> [3, 4, 5, 6, 7, 8, 9, 10]
    grab_part(arr,8,7)  #=> [1, 2, 3, 4, 5, 6, 7, 8]
    grab_part(arr,9)    #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
    grab_part(arr,9,9)  #=> [2, 3, 4, 5, 6, 7, 8, 9, 10]
    grab_part(arr,9,8)  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
    grab_part(arr,10)   #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    grab_part(arr,10,9) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    还有一些。

    grab_part(arr,5,6)  #=> [5, 6, 7, 8, 9]
      #=> [3, 4, 5, 6, 7] 
    grab_part(arr,5,8)  #=> [3, 4, 5, 6, 7] 
      #=> [5, 6, 7, 8, 9] 
    grab_part(arr,5,3)  #=> [5, 6, 7, 8, 9] 
      #=> nil 
    grab_part(arr,5,10) #=> [3, 4, 5, 6, 7] 
      #=> nil 
    

    【讨论】:

    • 不完全清楚选项应该如何解决?我相信你有一些东西,只是没有看到相关性。我得到1 <= option >=4 截断返回的数组
    【解决方案3】:

    要完成您的任务,您可以使用slice 方法。仅供参考,(1..10) 是一个范围对象,而不是一个数组。要使用slice方法,需要先使用(1..10).to_a将范围改为数组

    slice 接受两个输入,起始索引和长度。所以你可以通过(1..10).to_a.slice(2,5) 得到[3,4,5,6,7]

    【讨论】:

    • 他不知道起始索引在哪里,所以这里还有更多工作要做才能完成。
    • 对不起,在最初的帖子中并不清楚。需要目标数字是动态的。如果我知道目标数字以及该数字在数组中的位置,这将非常有用。但是,当尝试定位阵列的后面数字时变得更加困难。如果first input > 5,则截断数组
    【解决方案4】:

    这是我目前的工作解决方案。它不像我想要的那样雄辩,但它对我正在寻找的东西很有效。

    def grab_neighbors(array, num, range)
      index = array.index(num)
      target_length = range * 2 + 1
      if index < range
        return array.slice(0, target_length)
      elsif index >= (array.length - range)
        return array.slice(-target_length, target_length)
      else
        return array[(index - range)..(index + range)]
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多