Si vous cherchez quelque chose, il existe une méthode comme find
, vous ne pouvez pas l'utiliser comme filter
,
Je me demandais quand utiliser «take while» et «drop while»
Mais l'autre jour, j'ai senti que j'étais capable de bien l'utiliser (?) Alors je vais le lancer comme une petite histoire
data/output/user/contract.csv
Laissez la partie (disons base) et la partie de ʻuser
(disons dir) jusqu'à ʻoutput
def base = path.split('/')[0..1].join('/') // data/output
def dir = path.split('/')[2] // user
data/ver1.0/output/user/contract.csv
Hmm ... j'ai changé les indices ...
def base = path.split('/')[0..2].join('/') // data/ver1.0/output
def dir = path.split('/')[3] // user
Ce sont les données factices utilisées dans le test!
test/data/ver1.0/output/user/contract.csv
i ... si devrait être utilisé ... haha ...
if (isTest) {
def base = path.split('/')[0..3].join('/') // test/data/ver1.0/output
def dir = path.split('/')[4] // user
} else {
def base = path.split('/')[0..2].join('/') // data/ver1.0/output
def dir = path.split('/')[3] // user
}
C'est difficile à comprendre avec un accès en indice, et je ne supporte pas du tout les changements dans la structure des répertoires. De plus, changer l'indice avec un drapeau est une science-fiction!
Si vous voulez jusqu'à ... / output
, prenez un moment,
Si vous voulez la prochaine sortie ʻafter, laissez tomber, c'était bien!
def base = path.split('/').takeWhile {it != 'output'}.join('/').concat('/output') // data/ver1.0/output
def dir = path.split('/').dropWhile {it != 'output'}[1] // user
Si tel est le cas, il peut être géré automatiquement de manière flexible dans une certaine mesure (bien que la configuration sous ʻoutputne change pas pour des raisons de conception d'outil). Même ainsi, j'ai en fait écrit
take while pour la première fois, mais cela n'inclut pas
output` ... Je suis un peu déçu là-bas ...
Groovy Facile à écrire, comme dans l'exemple La chaîne de méthodes est facile à lire et il est facile d'écrire des fonctions anonymes.
Python
path = 'data/ver1.0/output/user/contract.csv'
import itertools
taken_iter = itertools.takewhile(lambda x: x != 'output', path.split('/'))
print '/'.join(list(taken_iter)) + '/output' # data/ver1.0/output
dropped_iter = itertools.dropwhile(lambda x: x != 'output', path.split('/'))
print list(dropped_iter)[1] # user
J'aime Python, mais je suis un peu déçu ...
Puisque xxx while importe et appelle la méthode, vous devez appliquer list ()
ou join ()
au résultat.
Si vous l'écrivez sur une seule ligne, ce sera ....))))
Les fonctions anonymes sont également un peu plus difficiles à lire que Groovy et Scala, et il est difficile de comprendre ce qu'elles font dans l'ensemble, donc je suis désolé!
Haskell
import Data.List
import Data.List.Split
main = do
let path = "data/ver1.0/output/user/contract.csv"
print $ (intercalate "/" $ (takeWhile (/= "output") $ splitOn "/" path)) ++ "/output"
print $ (dropWhile (/= "output") $ splitOn "/" path) !! 1
Parce qu'il y a beaucoup de choses à faire, il y aura beaucoup de (...)
...
De plus, cela n'a rien à voir avec le sujet principal, mais pourquoi ne pas l'utiliser sans installer splitOn
!
Je l'utilise assez souvent!
Haskell2
import Data.List
import Data.List.Split
main = do
let path = "data/ver1.0/output/user/contract.csv"
let reversed = reverse $ splitOn "/" path
print $ intercalate "/" $ reverse $ dropWhile (/= "output") reversed
print $ last $ takeWhile (/= "output") $ reversed
Si c'est takeWhile, l'essentiel «sortie» n'est pas inclus dans le résultat, j'ai donc essayé d'inverser les éléments Est-ce rafraîchissant?
J'ai aussi pensé à PHP, mais cela ne semblait pas faire de différence notable, alors je l'ai omis. Java semble gênant (biaisé), donc je l'ai rejeté. Il est bon de connaître diverses fonctions en écrivant dans différentes langues!
Pourquoi est-ce toujours plus long avec juste cette petite histoire ... Mais ce n'est pas bon de dire la commodité!
De plus, il n'y a aucune opinion selon laquelle "chemin sous forme de chaîne de caractères" devrait être divisé par "sortie"!
Recommended Posts