# Arraylist von allen bildern  filtern und sortieren



## AmsananKING (22. Dez 2020)

Hallo alle Zusammen,
Ich habe erst vor ein bis zwei Monaten angefangen zu Programmieren und möchte gerne ein Spiel programmieren hierzu habe ich Sprites erstellt und in einem Ordner gespeichert. Nun habe ich die Bilder aus dem Ordner in einer Liste gespeichert. Jetzt möchte ich Arrays jeweils nach den Strings dem Key entsprechend erzeugen. Diese Strings möchte ich mit den File paths aus der ersten Liste mit einander vergleichen, dann die Arrays dem key entsprechend befüllen. Am Ende möchte ich die File Arrays in einer File[] Arrayliste speichern. Kann mir jemand hierbei helfen.
Mit freundlichen Grüßen Amsi 

[CODE lang="java" title="List.class" highlight="43-46,34"]package Bilder.Resizer.Lister;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;


public class List {

    static ArrayList<File[]> list =new ArrayList<>();
    static ArrayList<File> filing =new ArrayList<>();
    static final File dir=new File("//src//Textures");
    static final String[] EXTENSIONS = new String[]{
            "gif", "png", "bmp"
    };
    static final String[] key={"IDLE","ATTACK","HURT","DIE","JUMP","WALK","RUN","background"};


    static final FilenameFilter IMAGE_FILTER =new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            for (final String ext :EXTENSIONS){
                if (name.endsWith("."+ext)){
                    return (true);
                }
            }
            return false;
        }
    };
    public static void Listing(){

        //Dateien bzw Bilder werden in filing gespeichert
        if (!dir.isDirectory()){System.out.println("Kein Ordner");}
        else {
            for (final File f:dir.listFiles(IMAGE_FILTER)){
                try {
                   filing.add(f);
                }catch (final Exception e){}
            }
        }
        /*hier soll in einer For-Schleife(int i=0;i<filing.size;i++) in einem if  alle File.path.contains key[0]

            jeweils in new Array File vorerst gespeichert werden um dann durch list.add() das Array mit den Files welche alle den String "Idle" im Path beeinhaltet zu speichern
        * */
    }

}
[/CODE]


----------



## mihe7 (22. Dez 2020)

Sprites sind Ressourcen und solche behandelt man nicht wie Dateien, sondern wie ... Ressourcen. Diese werden in Java-Packages abgelegt und somit über den Classpath geladen. Je nach verwendetem Build-Tool/IDE/Einstellungen sind die dazugehörigen Dateien direkt neben den Java-Dateien oder in getrennten Bereichen abzulegen. 

Mit Class#getResource bzw. Class#getResourceAsStream kannst Du die betreffende Ressource dann ansprechen. Der anzugebende Pfad ist dann relativ zum Classpath. 

Hört sich alles fürchterlich kompliziert an, ist aber im Endeffekt recht einfach.

Mal ein konkretes Beispiel. Sagen wir mal, Du möchtest sprite.png laden. Dieses legst Du in ein Paket org.javaforum.amsanan.images ab, d. h. unter src/org/javaforum/amsanan/images/sprite.png (bei Maven/Gradle wäre es src/main/resources/org/javaforum/amsanan/images/sprite.png).

Im Code kannst Du Dir dann eine URL zur Ressource mittels `getClass().getResource("/org/javaforum/amsanan/images/sprite.png")` geben lassen (man beachte, dass src/... dort nicht angegeben wird). Alternativ kannst Du auch einen InputStream erhalten, wenn Du getClass().getResourceAsStream(...) verwendest.

Hintergrund ist, dass Ressourcen zur Anwendung gehören. Wenn Du aus Deinem Spiel ein Jar-File erstellst, werden die Ressourcen dort mit rein gepackt. Am Code musst Du dann nichts ändern, d. h. die Ressourcen werden dann automatisch aus dem Jar-File geladen.


----------



## AmsananKING (22. Dez 2020)

Danke für die Antwort,
Bei meinem Code kann ich über ImageIO.read(file) in BufferedImage umwandeln und ich habe das so implementiert, dass mein FilenameFilter alle  Dateien aus dem Package "Textures" mit png Endungen erkennen kann könnte ich, das so implementieren, dass der Filter im ersten Lauf aus dem Array key das erste Objekt bzw. den String "IDLE"    mit dem Arraylist vergleichen kann und dann in einem Array(File[]) speichern kann.
Ich lade hier auch ein Bild des Projektes hoch, damit mein Problem vielleicht deutlicher wird.
Mit freundlichen Grüßen Amsi


----------



## thecain (22. Dez 2020)

Intellij markiert dir nicht zum Spass die hälfte gelb. Schau dir die Punkte doch mal an, vielleicht erledigt sich dein Problem dann vin selber...


----------



## AmsananKING (22. Dez 2020)

Danke für die Tipps,
Ich habe die Klasse neu sortiert und verbessert und habe nun eine doppelte Schleife genutzt um die Filepaths zu ordnen genau so geordnet wie die Strings im Array "Key".
P.S: Ich bin seit gestern erst auf diesem Forum online kann man diesen Thread für nicht mehr so wichtig einstellen. 
Hier ist die Schleife:
[CODE lang="java" title="Doppelte Schleife"] for (int i=0;i<key.length;i++){
                    int count =i;
                    for (int j=0;j<filing.size();j++){
                        if (filing.get(j).getPath().contains(key[count])){
                            System.out.println(filing.get(j));
                        }
                    }
                }[/CODE]


----------



## mihe7 (22. Dez 2020)

AmsananKING hat gesagt.:


> Bei meinem Code kann ich über ImageIO.read(file) in BufferedImage umwandeln und ich habe das so implementiert, dass mein FilenameFilter alle Dateien aus dem Package "Textures" mit png Endungen erkennen kann



Gerade das ist nicht der Fall: mit File werden Deine Bilder nicht aus einem Package, sondern aus dem Dateisystem geladen. Das fällt Dir spätestens auf die Füße, wenn Du die Anwendung außerhalb der IDE und ggf. außerhalb des Projektverzeichnisses starten willst. Der Ordner "src" steht dann nicht mehr zur Verfügung und Dein Programm findet keine Bilder mehr.

Schauen wir mal, wie lange das mit Deinen File-Arrays gut geht


----------



## AmsananKING (22. Dez 2020)

Okay Ich sehe das Problem, wie kann ich aus diesem Inputstream alle Bilder in eine BufferedImage Liste laden.   
[CODE lang="java" title="Inputstream"] InputStream inputStream = getClass().getResourceAsStream("/net/Amsi/Textures");[/CODE]


----------



## mihe7 (22. Dez 2020)

ImageIO.read funktioniert auch mit Streams und URLs.


```
ImageIO.read(getClass().getResource("/net/Amsi/Textures/Bild.png"));
// oder
ImageIO.read(getClass().getResourceAsStream("/net/Amsi/Textures/Bild.png"));
```


----------



## AmsananKING (22. Dez 2020)

Irgendwie kriege ich das nicht so ganz hin, kann ich einen Inputstream erstellen um alle Images zu laden. Dazu noch eine Frage: kann ich den Inputstream eigentlich filtern.
Danke für die Hilfe.
[CODE lang="java" title="Inputstream"]Inputstream inp =getClass().getResourceAsStream("net/Amsi/Textures");[/CODE]


----------



## mihe7 (22. Dez 2020)

AmsananKING hat gesagt.:


> kann ich einen Inputstream erstellen um alle Images zu laden


Nein. Jedes File einzeln.


----------



## AmsananKING (22. Dez 2020)

Also müsste ich, wenn ich 50 Bilder habe 50 Inputstreams erstellen.
Kann ich die Sprites vereinfachen? So dass ich eine Datei laden müsste?


----------



## mihe7 (22. Dez 2020)

AmsananKING hat gesagt.:


> wenn ich 50 Bilder habe 50 Inputstreams erstellen.


Ja, aber nicht parallel.



AmsananKING hat gesagt.:


> Kann ich die Sprites vereinfachen? So dass ich eine Datei laden müsste?


Klar, Du kannst alle Sprites in ein großes Bild einfügen und aus dem Bild dann die betreffenden Bereiche (Sprites) rausziehen. 

Am einfachsten wird es sein, wenn Du die Bilder systematisch benennst. Das scheint bei Dir sowieso der Fall zu sein:  1_entity_000_<key>_<nr>.png

Dann kannst Du einfach alle Resource-Namen erstellen, also etwa so:

```
private static final int PICS_PER_SPRITE = 7;
private Map<String, List<BufferedImage>> sprites = new HashMap<>();
....
for (String key : keys) {
    for (int seqNo = 0; seqNo < PICS_PER_SPRITE; seqNo++) {
        String resourceName = String.format("/net/Amsi/Textures/1_entity_000_%s_%03d.png", key, seqNo);
        BufferedImage image = ImageIO.read(getClass().getResource(resourceName));
        sprites.computeIfAbsent(key, k -> new ArrayList<BufferedImage>()).add(image);
    }
}
```
Damit kannst Du Dir per

```
sprites.get("DIE")
```
eine Liste der Bilder mit dem Key "DIE" geben lassen. Vom Design her ist das zwar nicht toll, sollte aber funktionieren.


----------

