La manera más fácil es definir un orden implícito [T] en ellos, pero luego debe pasar este orden a la función de ordenación (o cualquier otra función que quiera compararlos). También es posible pasarlo implícitamente.
Otra forma sería, para extender la clase tupla por el operador < a través de una conversión implícita:
implicit def compareTuple[T](lhs: (T,T)) = new {
def <(rhs: (T,T)) = lhs._1<rhs._1 || (lhs._1==rhs._1 && lhs._2<rhs._2)
}
edición: Si usted quiere tener los otros operadores de comparación también se podía conseguir heredando de ordenada [T]:
implicit def compareTuple[T](lhs: (T,T)) = new Ordered[(T,T)] {
def compare(rhs: (T,T)) = ...
}
Edit2: Si también necesita comparar tuplas de diferentes tamaños, puede usar la función productIterator que se define en todas las clases de tuplas (see documentation) y le permite obtener un iterador sobre la tupla. De esta forma podrías escribir una función como la que harías con una lista.
Edit3: Esto sería algo así como:
implicit def compareTuple[T <: Product](lhs: T) = new Ordered[T] {
def compare[U <: Product](rhs: U) = {
def compare(lhs: Any, rhs: Any) = ...
def iteratorCompare(lhs: Iterator[Any], rhs: Iterator[Any]):Int =
if(!lhs.hasNext)
if(!rhs.hasNext)
0
else
-1
else if(!rhs.hasNext)
1
else
compare(lhs.next,rhs.next)
iteratorCompare(lhs.productIterator,rhs.productIterator)
}
}
Pero con este enfoque tiene que tener cuidado acerca de los tipos. Como la función no conoce los tipos de los elementos de tupla (pueden ser diferentes dentro de la misma tupla), solo puede proporcionarle un iterador [Cualquiera]. Por lo tanto, debe definir una función de comparación (Cualquiera, Cualquiera) para manejar lo que desee.
Buenos puntos, Daniel. He editado mi pregunta para indicar que las tuplas comparadas siempre tienen el mismo valor. En cuanto a los tipos no ordenados, mis tuplas deberían tener símbolos (esa es la razón por la que recurrí a las tuplas en lugar de a las listas), pero como no he encontrado ninguna forma de ordenar símbolos, utilizaré los números. ¿Debo usar listas entonces? ¿Qué pasa si realmente necesito agregar símbolos a la lista? – lasaro
@lasaro Bueno, ahora que simplificó el problema, hay una solución relativamente fácil. Ver respuesta editada. –
Gracias Daniel, por tu ejemplo muy conciso. – lasaro