Java array naar arraylist converteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 18:04
Ik gebruik in een programma de java File class. Nu heb ik een subclasse gemaakt genaamd CFile waar wat extra methoden toegevoegd zijn (isImage, getExtension… etc.).

Nu gebruik ik door heel mijn programma de klasse CFile, omdat ik die extra informatie nodig heb, en dit werkt prima. Echter ergens in het programma gebruik ik de functie (een functie van de klasse File): listFiles()
Dit geeft terug een array van File objecten, dus File[], maar ik zou een array van CFile objecten terug willen krijgen, dus CFile[]. Dit is omdat ik uiteindelijk het array in een ArrayList<CFile> object moet krijgen.
Ik doe het nu op de volgende manier:

code:
1
2
3
4
5
6
// Copy items from array to arraylist
for (int i = 0; i < array.length; i++) 
{
    CFile fileCast = new CFile(array[i].getAbsolutePath());
    al.add(fileCast);
}


Echter als array erg groot wordt kost dit nogal wat tijd. Is er een snellere manier?
Ik had dit al gevonden:
code:
1
2
List list = Arrays.asList(array);   
ArrayList arrayList = new ArrayList(list);


Als dit zou werken ben ik dus van een, potentieel zware, loop af. Echter Arrays.asList levert een list van File op en mijn ArrayList bevat CFile. Ik zit dus met een soort van Casting probleem… ik kan niet File naar CFile casten.
Hoe kan ik zoiets op een snelle manier doen?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Kun je niet gewoon dat soort methodes public static maken en op de normale manier aanroepen? Het staat misschien iets minder mooi, maar je verdoet je tijd niet met dit soort onzin. :p Als je dat niet wil, kan het in ieder geval zinnig zijn om een initialCapacity op te geven.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Door je CFile klasse weg te smijten en va dje extra methods (static) utility methods te maken, waar je gewoon het File object aan meegeeft. Anders ga je constant File instanties moeten omzetten naar CFile instanties.

Het is immers geen casting probleem wat je hebt. File#listFiles() geeft Files terug en geen CFile instanties. Dat kan je niet casten, maar je moet effectief een nieuwe CFile instantie maken. Er is dus geen korte oplossing

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14-10 02:10

Nick_S

++?????++ Out of Cheese Error

Er is een korte oplossing. Override de listFiles functie van File. Als je naar de implementatie kijkt:

Java:
1
2
3
4
5
6
7
8
9
10
    public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
    }


Is het heel makkelijk om deze aan te passen, zodat hij CFiles terug geeft:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CFile extends File {

    public CFile(File parent, String child) {
        super(parent, child);
    }

    @Override
    public CFile[] listFiles() {
        String[] ss = list();
        if (ss == null)
            return null;
        int n = ss.length;
        CFile[] fs = new CFile[n];
        for (int i = 0; i < n; i++) {
            fs[i] = new CFile(this, ss[i]);
        }
        return fs;
    }
}

[ Voor 10% gewijzigd door Nick_S op 28-08-2010 11:38 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Op het moment dat er een File instance teruggegevend wordt, dan zul je toch echt door alle items heen moeten lopen en deze verpakken in een CFile instance.

Wat jij zul willen, dat is dat de uitvoer van de listFiles() die een array van File instances teruggeeft, gelijk als een CFile gebruikt zou kunnen gaan worden, dat is gewoon niet mogelijk

code:
1
List<CFile> cf = Arrays.asList(listFiles());

Die code is echter niet valid, omdat je nu gaat typecasten naar een implementatie die onbekend is bij de instances die door listFiles teruggegeven wordt.

De nu gebruikte oplossing is volgens mij gewoon het best wat je kunt bereiken...

Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 14-10 13:19
Nick_S schreef op zaterdag 28 augustus 2010 @ 11:35:
Er is een korte oplossing. Override de listFiles functie van File. Als je naar de implementatie kijkt:

Java:
1
2
3
4
5
6
7
8
9
10
    public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
    }


Is het heel makkelijk om deze aan te passen, zodat hij CFiles terug geeft:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CFile extends File {

    public CFile(File parent, String child) {
        super(parent, child);
    }

    @Override
    public CFile[] listFiles() {
        String[] ss = list();
        if (ss == null)
            return null;
        int n = ss.length;
        CFile[] fs = new CFile[n];
        for (int i = 0; i < n; i++) {
            fs[i] = new CFile(this, ss[i]);
        }
        return fs;
    }
}
Dit werkt overigens alleen vanaf Java 1.5, aangezien je nu een covariant return type hebt. Maar dat zal hopelijk geen probleem zijn voor TS.

If the world wouldn't suck, we'd all fall off


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14-10 02:10

Nick_S

++?????++ Out of Cheese Error

En je zou de volgende functie ook nog in je CFile classe erbij kunnen zetten:

Java:
1
2
3
    public List<CFile> listFilesAsList() {
        return Arrays.asList(listFiles());
    }

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Nick_S schreef op zaterdag 28 augustus 2010 @ 11:35:
Er is een korte oplossing. Override de listFiles functie van File. Als je naar de implementatie kijkt:
Is het een 'korte oplossing' om allerlei library-functies te gaan herimplementeren? Lijkt me eigenlijk toch niet aan te raden. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 18:04
Nick_S schreef op zaterdag 28 augustus 2010 @ 11:35:
Er is een korte oplossing. Override de listFiles functie van File. Als je naar de implementatie kijkt:

Java:
1
2
3
4
5
6
7
8
9
10
    public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
    }


Is het heel makkelijk om deze aan te passen, zodat hij CFiles terug geeft:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CFile extends File {

    public CFile(File parent, String child) {
        super(parent, child);
    }

    @Override
    public CFile[] listFiles() {
        String[] ss = list();
        if (ss == null)
            return null;
        int n = ss.length;
        CFile[] fs = new CFile[n];
        for (int i = 0; i < n; i++) {
            fs[i] = new CFile(this, ss[i]);
        }
        return fs;
    }
}
Lijkt me de makkelijkste oplossing zoiets.
Dit werkt overigens alleen vanaf Java 1.5, aangezien je nu een covariant return type hebt. Maar dat zal hopelijk geen probleem zijn voor TS.
Mocht dat overriden niet gaan kan ik de functie altijd nog een andere naam geven. Overigens het is voor Android... ik neem aan dat daar de meeste (of toch een) recente versie van Java gebruikt wordt, dus zal wel werken denk ik.

Thanks ik ga het proberen en zal nog wel laten weten of dit lukt.

[ Voor 12% gewijzigd door Schmoove op 28-08-2010 12:08 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Des te meer reden om geen standaard-functies te gaan herimplementeren: kost alleen maar extra geheugen. :p En is het nu echt zo boeiend of je file.isImage() of isImage(file) doet?
Overigens zijn normaal onderhoudskosten het belangrijkste probleem hiermee, maar dit lijkt meer hobby.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 25-09 11:11

Killemov

Ik zoek nog een mooi icooi =)

Een File is niet meer dan een abstractie van het filesysteem. (Of een meer specifieke typering van het pad dan een String.) Als je iets over de inhoud van een file wilt weten, je gaat 'm openen, dan kun je dat beter niet aan een afgeleide van File vragen. Een utility method FileUtil.isImage(File file) gebruiken of pas een wrapper instantieren wanneer je 'm nodig hebt is dan beter.

Hey ... maar dan heb je ook wat!

Pagina: 1