Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. // Flatten integers array
  2. //
  3. // This simple utility flattens an arbitrarily nested array of integers.
  4. // Example: [[1,2,[3]],4] -> [1,2,3,4]
  5. //
  6. // Example usage:
  7. // $ ./flatten '[1,2,[4,5,[6],12],14]'
  8. // [1 2 4 5 6 12 14]
  9. //
  10. // If no argument is provided, an example data is used: [[1,2,[3]],4]
  11.  
  12. package main
  13.  
  14. import (
  15. "encoding/json"
  16. "fmt"
  17. "os"
  18. )
  19.  
  20. type nestedArr []interface{}
  21.  
  22. func main() {
  23. // Determine the input string: either the default one, or the first argument,
  24. // if provided
  25. str := `[[1,2,[3]],4]`
  26. if len(os.Args) >= 2 {
  27. str = os.Args[1]
  28. }
  29.  
  30. // Unmarshal input string
  31. var nested nestedArr
  32. err := json.Unmarshal([]byte(str), &nested)
  33. if err != nil {
  34. fmt.Println("invalid data: argument must be an array of integers")
  35. os.Exit(1)
  36. }
  37.  
  38. // Flatten array and print the result
  39. flat, err := flattenIntArr(nested)
  40. if err != nil {
  41. fmt.Println(err.Error())
  42. os.Exit(1)
  43. }
  44. fmt.Println(flat)
  45. }
  46.  
  47. // flattenIntArr flattens array of integers. Example: [[1,2,[3]],4] -> [1,2,3,4]
  48. func flattenIntArr(nested nestedArr) ([]int, error) {
  49. var ret []int
  50.  
  51. // Iterate all items in the input array (items should be either integers or
  52. // other arrays)
  53. for _, cur := range nested {
  54. switch val := cur.(type) {
  55.  
  56. case float64:
  57. // Current item is a number: check if it's an integer, and if so, append it
  58. // to the resulting array
  59. intval := int(val)
  60. if float64(intval) != val {
  61. return nil, fmt.Errorf("invalid data: %f is not an integer", val)
  62. }
  63. ret = append(ret, intval)
  64.  
  65. case []interface{}:
  66. // Current item is an array: call flattenIntArr() recursively
  67. flat, err := flattenIntArr(val)
  68. if err != nil {
  69. return nil, err
  70. }
  71. ret = append(ret, flat...)
  72.  
  73. default:
  74. return nil, fmt.Errorf("invalid data: %v is neither an integer nor array", val)
  75. }
  76. }
  77. return ret, nil
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement