2015-04-30 10 views
5

Ho dati in una relazione molti-a-uno. Mi piacerebbe essere in grado di cercare i dati da entrambe le direzioni. Un esempio:Java: ricerca bidirezionale many-to-one

0 : a 
1 : b 
2 : b 
3 : b 
4 : c 

get(0) --> a 
get(1) --> b 
get(a) --> 0 
get(b) --> (1:3) 

Ha senso? È possibile?

+0

che non ha senso. è possibile –

+1

Gli elementi sinistro e destro dello stesso tipo o di tipo diverso? –

+0

Ci sono certamente situazioni in cui questo può essere utile, ed è molto possibile. Quali problemi stai avendo con la creazione di una struttura dati che può farlo? [Cosa hai provato?] (Http://whathaveyoutried.com) –

risposta

4

È sicuramente possibile. Ecco un frammento di codice per gli elementi che aggiungono:

Map<Integer,String> forwardMap = new HashMap<>(); 
Map<String,Set<Integer>> reverseMap = new HashMap<>(); 

void add(Integer x, String y) { 
    forwardMap.put(x, y); 
    if (!reverseMap.containsKey(y)) 
     reverseMap.put(y, new HashSet<Integer>()); 
    reverseMap.get(y).add(x); 
} 

Nota: Apache Commons ha BidiMap e Google Guava ha BiMap, ma questi sembrano essere uno-a-uno mappe, non consentendo il molti-a-un caso ha chiesto nella domanda.

+0

Mi piace questa idea. Ho intenzione di giocarci. –

+1

+1 In generale, le raccolte specializzate sono spesso facili da creare combinando due o più raccolte java.util con codice wrapper che espone il comportamento richiesto. –

-1

sì usare JPA (Java Persistence API) ti darà la possibilità di fare @OneToMany e nel bambino ti darà List con @ManyToOne fondamentalmente sarà riferimento alla proprietà della tua proprietà brevettuale. Esempio

public class Table1{ 
    @Id 
    int id ; 
    @OneToMany 
    List<Table2> ls ; 

    // getter and setter ... 
} 

public class Table2{ 
     @Id 
     int id ; 
     @ManyToOne 
     Table1 t1 ; 

     // getter and setter ... 
    } 

spero che questo aiuto si

+3

Questa non è una domanda DB, si stanno solo chiedendo come farlo con JavaSE. –

1

Basta usare 2 hahsmaps. Diciamo che il tuo "uno" è di tipo Integer e "many" è di tipo String per semplicità.

HashMap<Integer, String> intToString = new HashMap<>(); 
HashMap<String, HashSet<Integer>> stringToInt= new HashMap<>(); 

funciton per gli elementi di collegamento:

public void linkElements(Integer i, String s){ 
    intToString.add(i,s); 
    stringToInt.get(s).add(i); 
} 

valori ricevendo sarebbe come questo:

intToString.get(0); // returns "a" 
stringToInt.get("b"); // returns a set {1,2,3} 
+0

Ciao. Questo è un duplicato della mia risposta, e non aggiunge valore alla discussione – Nayuki

+1

L'ho digitato contemporaneamente a te. Basta digitare più velocemente apparentemente - continua a dare il tuo upvote. –

+0

Grazie. A proposito, devi aggiungere elementi alla tua mappa 'stringToInt', altrimenti' get (s) 'restituirà sempre' null'. – Nayuki