Archivia e accedo ai miei oggetti usando un ID int

0

Ho creato una classe HidDevice per formare oggetti che concatenano l'input da ciascun dispositivo HIDDecisamente finché non viene premuto un tasto speciale (INVIO). Quindi ogni istanza di HidDevice ha campi come int deviceId , String concatedInput .

public class HidDevice  {

    private int deviceId = -1;
    private String concatedInput;

    public HidDevice (int id) {
        this.deviceId = id;
        this.concatedInput = null;
    }

    public keypress (Event event) {
        this.concatedInput += event.code;
        // ....
    }

 //....
}

Ma non so come posso memorizzare queste istanze di hidDevice. Sembra che ci siano molte possibilità in Java, non sono sicuro di quale usare sia il migliore.

Su ogni keyEvent nella mia attività Android, voglio chiamare hidProcessInput.myKeyEvent(event) che controlla event.getDeviceId() e aggiunge l'input all'oggetto con questo id. Se non ci sono oggetti per questo id, deve essere creato.

public class HidProcessInput {

    // Wrong for my case
    private static List<HidDevice> hidDevices = new ArrayList<>();

    // a singleton class
    private static HidProcessInput instance = null;
    public static HidProcessInput getInstances() {
        if (instance == null) {
            instance = new HidProcessInput();
            init();
        }
        return instance;
    }

    public boolean myKeyEvent (KeyEvent event) {
        int deviceId = event.getDeviceId();

        // here create new hidDevice instance if this id not still exist
        /* if (!hidDevices.contains(deviceId)) {
            HidDevice hidDevice = new HidDevice(deviceId);
            hidDevices.add(id,hidDevice);
           }
        */

        // add the character to the the correct hidDevice instance
        /* hidDevices.get(id).keypress(event);
        */
}

Quindi cosa devo usare per memorizzare gli oggetti, per poter accedere a questi oggetti usando deviceId? Ho provato ad esempio ArrayList, ma ho notato che gli indici qui non possono essere scelti liberamente.

Ho trovato cose come TreeSet, HashSet o Map, ma non sono sicuro di quale usare in questo caso?

    
posta Lutz 24.07.2016 - 12:21
fonte

2 risposte

1

Nell'ambiente Android, la risposta è SparseArray che è una struttura ottimizzata per % tipo di struttura di<Integer, Object>. I vantaggi principali sono la mancanza di boxe (tutte le chiavi per una mappa devono essere oggetti piuttosto che primitive) e la mancanza dell'ulteriore oggetto che è la chiave. Un motivo chiave per la creazione di questo è il suo ingombro di memoria inferiore al costo di un po 'di velocità.

Ci sono alcuni avvertimenti che vengono con SparseArray in quanto è più lento di una HashMap per l'inserimento e l'eliminazione, anche se questo non è qualcosa che si potrebbe osservare in elenchi di piccole dimensioni. Se questo è per memorizzare centinaia di valori ed è identificato come hot spot durante la profilazione, riconsiderare le altre strutture.

All'interno di Java puro, probabilmente starai guardando ad una delle implementazioni di Map.

HashMap fornirà l'inserimento e la ricerca più veloci, ma l'iterazione più lenta tra le voci.

LinkedHashMap fornirà inserimenti e ricerche leggermente più lenti di HashMap, ma la sua iterazione sarà più veloce a costo di più memoria (mantiene un elenco di voci collegate).

TreeMap fornisce l'inserimento e la ricerca più lenti, ma ti darà una iterazione rapida e ordinata.

La scelta esatta tra questi dipende dall'uso previsto della struttura e dalle prestazioni desiderate. Si noti che per i piccoli numeri di chiavi per le mappe (fino a poche centinaia), le differenze di prestazioni non sono probabilmente evidenti.

La soluzione generale è scrivere una matrice sparsa ( wikipedia ). Questo compito si trova occasionalmente nelle domande di intervista algoritmica.

    
risposta data 24.07.2016 - 14:13
fonte
0

Utilizzeresti una mappa se vuoi scegliere l'indice. Qualcosa sulla falsariga di      Map exampleMap = new HashMap< String, HidDevice > ; Questo ti permetterebbe di usare una stringa come chiave per ottenere il valore.

    
risposta data 24.07.2016 - 14:04
fonte

Leggi altre domande sui tag