Wenn Sie nach etwas suchen, gibt es eine Methode wie "finden", Sie können sie nicht wie "filtern" verwenden. Ich habe mich gefragt, wann ich "takewhile" und "dropwhile" verwenden soll
Aber neulich hatte ich das Gefühl, ich könnte es gut gebrauchen (?) Also werde ich es als kleine Geschichte werfen
data/output/user/contract.csv
Lassen Sie den Teil von "bis zu" (sagen wir Basis) und den Teil von "Benutzer" (sagen wir dir)
def base = path.split('/')[0..1].join('/') // data/output
def dir = path.split('/')[2] // user
data/ver1.0/output/user/contract.csv
Hmm ... ich habe die Indizes verschoben ...
def base = path.split('/')[0..2].join('/') // data/ver1.0/output
def dir = path.split('/')[3] // user
Dies sind die im Test verwendeten Dummy-Daten!
test/data/ver1.0/output/user/contract.csv
ich ... wenn sollte verwendet werden ... 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
}
Mit tiefgestelltem Zugriff ist es schwer zu verstehen, und ich kann Änderungen in der Verzeichnisstruktur überhaupt nicht ertragen. Darüber hinaus ist das Ändern des Index mit einer Flagge eine Science-Fiction!
Wenn Sie bis zu "... / output" möchten, nehmen Sie sich Zeit, Wenn Sie das "neben dem Ausgang" wollen, war Dropwhile in Ordnung!
def base = path.split('/').takeWhile {it != 'output'}.join('/').concat('/output') // data/ver1.0/output
def dir = path.split('/').dropWhile {it != 'output'}[1] // user
Wenn dies der Fall ist, kann es bis zu einem gewissen Grad flexibel automatisch gehandhabt werden (obwohl sich die Konfiguration unter "Ausgabe" aus Gründen des Werkzeugdesigns nicht ändert). Trotzdem habe ich zum ersten Mal "takewhile" geschrieben, aber es enthält keine "Ausgabe" ... Ich bin dort ein wenig enttäuscht ...
Groovy Einfach zu schreiben, wie im Beispiel Die Methodenkette ist leicht zu lesen und anonyme Funktionen zu schreiben.
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
Ich mag Python, aber ich bin ein bisschen enttäuscht ... Da xxxwhile die Methode importiert und aufruft, müssen Sie "list ()" oder "join ()" auf das Ergebnis anwenden. Wenn Sie es in eine Zeile schreiben, wird es "....))))" sein Anonyme Funktionen sind auch etwas schwieriger zu lesen als Groovy und Scala, und es ist schwer zu verstehen, was sie insgesamt tun. Es tut mir leid!
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
Da es viele Dinge zu tun gibt, wird es viele "(...)" geben ...
Es hat auch nichts mit dem Hauptthema zu tun, aber warum nicht ohne Installation von splitOn
!
Ich benutze es ziemlich oft!
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
Bei takeWhile ist die wesentliche "Ausgabe" nicht im Ergebnis enthalten, daher habe ich versucht, die Elemente umzukehren Ist es erfrischend?
Ich habe auch über PHP nachgedacht, aber es schien keinen merklichen Unterschied zu machen, also habe ich es weggelassen. Java scheint problematisch (voreingenommen) zu sein, also habe ich es abgelehnt. Es ist gut, verschiedene Funktionen zu kennen, indem man in verschiedenen Sprachen schreibt!
Warum wird es mit dieser kleinen Geschichte immer länger ... Aber es ist nicht gut, Bequemlichkeit zu vermitteln!
Es gibt auch keine Meinung, dass "Pfad als Zeichenfolge" durch "Ausgabe" geteilt werden sollte!
Recommended Posts