Come memorizzare un elenco di oggetti che potrebbero cambiare in futuro?

0

Ho un set di oggetti della stessa classe che hanno valori diversi dei loro attributi. e ho bisogno di trovare la migliore corrispondenza tra una funzione e determinati scenari fuori da questi oggetti.

In futuro anche questi oggetti potrebbero aumentare.

Abbastanza simile al modo in cui abbiamo la classe Colour in awt. abbiamo alcuni oggetti a colori statici nella classe con valori di rgb diff. Ma nel mio caso, devo scegliere il colore adatto tra quelli statici in base a determinati criteri.

Quindi dovrei tenerli in una lista di array o enum o tenerli come vars statici come nel caso dei colori. perché avrò bisogno di analizzare tutti loro e decidere la migliore corrispondenza. quindi ho bisogno di loro in una sorta di collezione. Ma in futuro, se avessi bisogno di aggiungere un altro tipo, dovrò modificare la classe e aggiungere un'altra chiamata list.add (oggetto) per questa e poi violerà il principio open-close. Come dovrei farlo?

Modifica Per essere più precisi ho circa 7-8 rami di ristoranti che non aumenteranno di molto .. possono essere 3-4 in pochi anni e ho bisogno di una funzione che restituisca il ristorante più vicino soddisfacendo pochi altri criteri.

E per quello ho bisogno di analizzare tutti per decidere quale si adatta maggiormente al cliente.

    
posta Amogh Talpallikar 21.03.2012 - 17:13
fonte

4 risposte

2

Archivia i negozi su disco. Vorrei raccomandare l'uso di un database, ma per la piccola quantità di dati xml andrebbe bene pure. All'avvio dell'applicazione leggere questo elenco in una raccolta. Non avresti bisogno di creare costanti per ognuna perché dovrai semplicemente interrogare l'elenco quando hai bisogno di un negozio. Questo ti impedirà di dover aggiornare il tuo codice solo per aggiungere un nuovo negozio. Inoltre, dato che stai calcolando le distanze, avrai bisogno di un elenco di tutti i codici postali e della latitudine e longitudine corrispondenti, in modo da poter calcolare la distanza tra due codici di avviamento postale. Questo potrebbe anche essere memorizzato su disco e molto probabilmente avrà bisogno di un aggiornamento più frequente rispetto all'elenco dei negozi. Inoltre, puoi creare una console di amministrazione che ti consente di aggiungere nuovi negozi e aggiornare i codici postali senza dover scrivere manualmente sul meccanismo di archiviazione che hai scelto.

    
risposta data 22.03.2012 - 15:25
fonte
3

Dipende molto da quanti oggetti hai e da quante dimensioni è libero di spostarsi in ogni oggetto.

Trovare la corrispondenza più simile per un valore a più dimensioni è qualcosa che si presta ai database spaziali e agli alberi di partizionamento dello spazio, ad es. un albero k-d . Ovviamente, se hai solo poche dozzine di oggetti, puoi anche controllarli tutti.

Penso che la tua analogia con la classe Colour potrebbe farti passare leggermente come (AFAIK) Non credo che Color fornisca comunque le capacità di matching più vicine e probabilmente avrai anche bisogno di lasciare lo spazio colore RGB per definire una metrica di distanza utile

    
risposta data 21.03.2012 - 18:47
fonte
3

Vai con un ArrayList. Puoi modificarlo liberamente e cercarlo velocemente. Non violerai il principio open-close.

Eccezione: se disponi di un lotto di voci, ad esempio oltre un milione, e stai utilizzando l'80% + della tua CPU e desideri una maggiore velocità, le cose diventano interessanti. I grandi array possono fare cose strane alla memoria in questa situazione se non si fa attenzione, e ArrayList farà cose strane quando non si sta guardando. Inoltre, se vuoi individuare l'oggetto più vicino nell'elenco ad un oggetto arbitrario, ad esempio il colore più vicino a cui hai qualcosa con un RGB di 233.121.55, avrai bisogno di un sistema di archiviazione multidimensionale. Dì un quadrifoglio o, con i colori, un ottetto. (Se i tuoi colori hanno un componente alfa, suppongo che avresti bisogno di un hexadecimaltree.)

Ma scommetto che ArrayList funzionerà bene per te. Puoi scansionare 100.000 voci in un ArrayList in un batter d'occhio.

    
risposta data 21.03.2012 - 22:17
fonte
1

Archivia semplicemente gli oggetti in ArrayList di tipo Oggetto . Quindi, puoi aggiungere qualsiasi tipo di oggetto a quella raccolta. Può essere una raccolta mista, alias eterogenea.

List<Object> mixedList = new ArrayList<Object>();
list.add(new String("I'm a string"));
list.add(new Integer(1));
list.add(new Long(1l));
    
risposta data 21.03.2012 - 20:39
fonte

Leggi altre domande sui tag