getvalue - tuple java 8




Utilizzo di coppie o 2 tuple in Java (10)

Questa domanda ha già una risposta qui:

Il mio Hashtable in Java trarrebbe vantaggio da un valore che ha una struttura a tupla. Quale struttura dati posso usare in Java per farlo?

Hashtable<Long, Tuple<Set<Long>,Set<Long>>> table = ...

Altri 2 cent: Iniziando con Java 7, ora esiste una classe per questo in Lib: javafx.util.Pair.

E sì, è standard Java, ora che JavaFx è incluso nel JDK :)


Anche se l'articolo è piuttosto vecchio ora, e anche se capisco che non sono davvero molto utile, penso che il lavoro svolto qui: http://www.pds.ewi.tudelft.nl/pubs/papers/cpe2005.pdf , sarebbe stato bello nel mainstream Java.

Puoi fare cose come:

int a;
char b;
float c;
[a,b,c] = [3,'a',2.33];

o

[int,int,char] x = [1,2,'a'];

o

public [int,boolean] Find(int i)
{
  int idx = FindInArray(A,i);
  return [idx,idx>=0];
}

[idx, found] = Find(7);

Qui le tuple sono:

  • Definiti come tipi primitivi - senza modelli / generici
  • Allocazione dello stack se dichiarata localmente
  • Assegnato utilizzando la corrispondenza del modello

Questo approccio aumenta

  • Prestazione
  • leggibilità
  • espressività

Con lombok è facile dichiarare una classe Pair :

@Data(staticConstructor = "of")
public class Pair<A, B> {
    private final A left;
    private final B right;
}

Questo genererà getter, costruttore statico denominato "of", equals() , hashcode() e toString() .

consultare la documentazione @Data per ulteriori informazioni


Crea una classe che descriva il concetto che stai effettivamente modellando e usandolo. Può solo memorizzare due Set<Long> e fornire loro degli accessor, ma dovrebbe essere chiamato per indicare che cosa esattamente ciascuno di questi set è e perché sono raggruppati.


Inizierò da un punto di vista generale sulle tuple in Java e finirò con un'implicazione per il tuo problema concreto.

1) Il modo in cui le tuple sono usate in linguaggi non generici è evitato in Java perché non sono sicuri per il tipo (per esempio in Python: tuple = (4, 7.9, 'python') ). Se vuoi ancora usare qualcosa come una tupla generica (che non è raccomandabile ), dovresti usare Object[] o List<Object> e lanciare gli elementi dopo un controllo con instanceof per assicurare la sicurezza del tipo.

Solitamente, le tuple in una determinata impostazione vengono sempre utilizzate allo stesso modo con la stessa struttura. In Java, è necessario definire esplicitamente questa struttura in una class per fornire valori e metodi ben definiti e sicuri per il tipo. Questo all'inizio sembra fastidioso e inutile, ma previene gli errori già in fase di compilazione .

2) Se hai bisogno di una tupla contenente le stesse (super-) classi Foo , usa Foo[] , List<Foo> o List<? extends Foo> List<? extends Foo> (o le controparti immutabili delle liste). Poiché una tupla non ha una lunghezza definita, questa soluzione è equivalente.

3) Nel tuo caso, sembra che tu abbia bisogno di una Pair (cioè una tupla di lunghezza ben definita 2). Ciò rende la risposta della maerica o una delle risposte supplementari la più efficiente dal momento che è possibile riutilizzare il codice in futuro.


Non penso che ci sia una classe di tuple per uso generico in Java, ma uno personalizzato potrebbe essere facile come il seguente:

public class Tuple<X, Y> { 
  public final X x; 
  public final Y y; 
  public Tuple(X x, Y y) { 
    this.x = x; 
    this.y = y; 
  } 
} 

Naturalmente, ci sono alcune importanti implicazioni su come progettare questa classe ulteriormente riguardo all'eguaglianza, immutabilità, ecc., Specialmente se si intende utilizzare le istanze come chiavi per l'hashing.



Se stai cercando una tupla Java a due elementi, prova AbstractMap.SimpleEntry .


Android Tuple Utils

Questo oggetto fornisce un'implementazione ragionevole di equals (), restituendo true se equals () è true su ciascuno degli oggetti contenuti.


javatuples è un progetto dedicato per le tuple in Java.

Unit<A> (1 element)
Pair<A,B> (2 elements)
Triplet<A,B,C> (3 elements)




tuples