Wegnemen met verwarring met kaarten/collecties (Groovy)

Ik definieer een verzameling waarvan wordt verondersteld dat hij twee delen van een regel in een door tabs gescheiden tekstbestand in kaart brengt:

def fileMatches = [:].withDefault{[]}

new File('C:\\BRUCE\\ForensicAll.txt').eachLine { line ->
def (source, matches) = line.split (/\t/)[0, 2]
fileMatches[source] << (matches as int)}

I end up with entries such as filename:[984, 984] and I want [filename : 984] . I don't understand how fileMatches[source] << (matches as int) works. How might I get the kind of collection I need?

0

1 antwoord

Ik weet niet zeker of ik begrijp wat je probeert te doen. Hoe zou u bijvoorbeeld een regel behandelen waarbij de twee waarden verschillend zijn in plaats van dezelfde (wat lijkt te zijn wat wordt geïmpliceerd door uw code)? Voor een kaart zijn unieke sleutels vereist, dus u kunt bestandsnaam niet als sleutel gebruiken als deze meerdere waarden heeft.

Dat gezegd hebbende, zou u het gewenste resultaat kunnen krijgen met de gegevens die worden geïmpliceerd door uw resultaat met:

def fileMatches = [:]
new File('C:\\BRUCE\ForensicAll.txt').eachLine { line ->
    def (source, matches) = line.split(/\t/)[0,2]
    fileMatches[source] = (matches as int)
}

Maar dit zal de gegevens kloppen (d.w.z. u zult altijd eindigen met de tweede waarde van de laatste regel van uw bestand.) Als dat niet is wat u wilt, wilt u misschien uw gegevensstructuur hier opnieuw bekijken.

Als alternatief, aannemende dat u unieke waarden wilt, kunt u het volgende doen:

def fileMatches = [:].withDefault([] as Set)
new File('C:\\BRUCE\ForensicAll.txt').eachLine { line ->
    def (source, matches) = line.split(/\t/)[0,2]
    fileMatches[source] << (matches[1] as int)
}

Dit resulteert in iets als [bestandsnaam: [984]] voor de voorbeeldgegevens en, bijvoorbeeld, [bestandsnaam: [984, 987]] voor bestanden met die twee waarden in de twee kolommen die u aan het controleren bent.

Nogmaals, het hangt echt af van wat je probeert vast te leggen. Als je meer informatie kunt geven over wat je probeert te bereiken, kan je vraag verantwoording afleggen ...

1
toegevoegd
@blaughli: Ik denk dan dat het eerste voorbeeld, dat ik net heb bijgewerkt, aan uw zaak moet voldoen ...
toegevoegd de auteur ig0774, de bron
@blaughli: cool!
toegevoegd de auteur ig0774, de bron
Dank je. Ik heb veel tekstregels die er als volgt uitzien: C: \ cygwin \ home \ pro-services \ git \ projectdb \ project \ counter.cp & zwnj; p 15 421 (let op: dat zijn tab gescheiden). Elke regel in het bestand heeft een uniek pad zoals C: \ cygwin \ ... (dat ik misschien verwarrend symboliseerde als bestandsnaam in mijn vraag) en unieke nummers, en ik wil je elk uniek pad toewijzen aan het tweede nummer op de regel met line.split (/ \ t /) [0,2] om items in een (verzameling?) te krijgen die er als volgt uitzien: < code> C: \ cygwin \ etc. : 421 . Het grote doel is om later de paden te isoleren met de 10 grootste waarden die daaraan zijn toegewezen.
toegevoegd de auteur blaughli, de bron
Proberen om toe te voegen (komt overeen met [1] als int) met fileMatches zonder het een standaardinstelling te geven, werpt een NullPointerException.
toegevoegd de auteur blaughli, de bron
Bedankt ig0774! Ik zal hier aan blijven werken
toegevoegd de auteur blaughli, de bron
Ik gebruikte fileMatches << ["$ source": komt overeen met int] en kreeg precies wat ik nodig had. Bedankt voor de hulp))
toegevoegd de auteur blaughli, de bron