Преобразование строки [] ключей объекта Amazon S3 в древовидную / хэш-карту и т. Д. - PullRequest
1 голос
/ 14 ноября 2011

Почувствуйте, что я немного утончен в этом вопросе, было бы здорово, если бы вы мне помогли.

В настоящее время я получаю данные из учетной записи хранения s3.S3 имеет плоскую файловую структуру, но создает впечатление, что файлы хранятся в каталогах.

Итак, вопрос в том, как мне преобразовать эту строку []

[ 
  "/company_1/user_1/1.txt",
  "/company_1/user_1/2.txt", 
  "/company_1/user_1/3.txt",
  "/company_1/user_1/4.txt",
  "/company_1/user_2/5.txt",
  "/company_1/user_2/6.txt",
  "/company_1/user_3/7.txt"
]

в хеш-карту типаthis

[
  name : "company_1", 
  children: [
              [
               name : "user_1",
               children : [
                             [name : 1.txt],
                             [name : 2.txt],
                             [name : 3.txt],
                             [name : 4.txt]
                          ]
              ],
              [
               name : "user_2",
               children : [
                             [name : 5.txt],
                             [name : 6.txt],
                          ]
              ],
              [
               name : "user_3",
               children : [
                             [name : 7.txt],
                          ]
              ],

           ]
]

Я использую Grails для визуализации данных в виде JSON для приложения Flex, используя Advanced Datagrid, и мне нужна древовидная структура, как если бы вы просматривали файлы на рабочем столе.

Какой самый лучший способ сделать это.

Заранее спасибо

1 Ответ

2 голосов
/ 14 ноября 2011

Самый быстрый способ вставить это в карту (не того формата, который вы хотели, а карту все равно), это сделать что-то вроде:

String[] example = [ 
  "/company_1/user_1/1.txt",
  "/company_1/user_1/2.txt", 
  "/company_1/user_1/3.txt",
  "/company_1/user_1/4.txt",
  "/company_1/user_2/5.txt",
  "/company_1/user_2/6.txt",
  "/company_1/user_3/7.txt"
]
example*.tokenize( '/' ).groupBy( { it[ 0 ] }, { it[ 1 ] } )

Это дает вам карту:

[
  "company_1": [
    "user_1":[
      ["company_1", "user_1", "1.txt"],
      ["company_1", "user_1", "2.txt"],
      ["company_1", "user_1", "3.txt"],
      ["company_1", "user_1", "4.txt"] ],
    "user_2":[
      ["company_1", "user_2", "5.txt"],
      ["company_1", "user_2", "6.txt"] ],
    "user_3":[
      ["company_1", "user_3", "7.txt"] ]
  ]
]

очевидно, требуется немного больше работы, чтобы перевести его в указанный вами формат: - /

edit

Думаю, я его получил ...

def crunch( k, v ) {
  ( v instanceof List ) ?
    [ name:k, children:v.collect { [ name : it[ -1 ] ] } ] :
    [ name:k, children:v.collect { k2, v2 -> crunch( k2, v2 ) } ]
}

def rsltList = example*.tokenize( '/' ).groupBy( { it[ 0 ] }, { it[ 1 ] } ).collect { k, v ->
  crunch( k, v )
}

означает, что rsltList является списком, содержащим:

[
  [ "name":"company_1",
    "children": [
      [ "name":"user_1",
        "children": [
          [ "name":"1.txt" ],
          [ "name":"2.txt" ],
          [ "name":"3.txt" ],
          [ "name":"4.txt" ] ] ],
      [ "name":"user_2",
        "children": [
          [ "name":"5.txt" ],
          [ "name":"6.txt" ] ] ],
      [ "name":"user_3",
        "children": [
          [ "name":"7.txt" ]]]
    ]
  ]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...