0
votes

Liste d'indexation de droite

en python, l'index -1 est le premier élément de la droite dans une liste. Comment le dernier nième élément d'une liste peut-il être récupéré à Kotlin de la manière la plus idiomatique? Écrire une extension pour cela?


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser Dernier .

par exemple xxx


3 commentaires

J'ai besoin du dernier nième élément, de sorte que cela ne me suffit pas: /


@Morinator Vous avez changé votre question après avoir répondu à votre question initiale


Oui, car de votre réponse m'a fait remarquer que cela n'a pas été formulé très clairement.



1
votes

Je pense, il n'y a pas de belle façon de faire cela. Je pense que le mieux que vous puissiez faire est que cela (tous les extraits de code contiennent la mise en œuvre de la fonction et l'exemple pour obtenir le dernier élément): xxx pré>

mais maintenant les derniers éléments sont indexés de 1 (plus ou moins comme en python). Si vous souhaitez indexer de 0, vous devez soustraire 1: p> xxx pré>

ou si vous souhaitez utiliser des index comme dans Python, vous devez ajouter N: P >

fun List.last(int n) = get(size() + n)
list.last(-1)


3 commentaires

N'est-ce pas off par un? On dirait que list.last (0) sera hors limites.


Oui, c'est vrai - mais je voulais faire cela comme dans Python, lorsque le dernier élément est -1. J'ajoute une note pour répondre


Si vous souhaitez utiliser -1, il devrait s'agir de la taille () + n , pas la taille () - N .



1
votes

@dey a déjà fourni une solution pour interroger des index négatifs, mais je pense que vous recherchez une fonction d'extension pour interroger des listes à l'aide d'index positifs et négatifs et à l'aide des supports. C'est ce que vous pouvez faire:

Les fonctions d'extension ne peuvent pas remplacer les méthodes existantes dans les classes. Depuis le Opérateur getter (qui est Celui qui vous permet d'utiliser des crochets comme dans votre exemple) existe déjà dans la classe de liste, vous ne pourrez pas créer une extension comme celle-ci. Cependant, vous pouvez créer une nouvelle méthode d'extension avec le même comportement: p> xxx pré>

Si vous souhaitez vraiment avoir votre propre implémentation à l'aide des supports, vous devez créer votre propre classe de liste. (en extension de l'interface de la liste) et remplacer la fonction Obtenir l'opérateur strong>. p>

(Par souci de clarté, je m'extroie de l'arraylist, donc je n'ai pas besoin de mettre en œuvre d'autres Membres) P>

class MyList<E> : ArrayList<E>() {
    override operator fun get(index: Int): E = if (index < 0) {
        super.get(size + index)
    } else {
        super.get(index)
    }
}

@Test
fun testMyList(){
    val list = MyList<Int>().apply {
        add(1);add(2);add(3)
    }
    assertEquals(3, list[-1])
    assertEquals(1, list[-3])
    assertEquals(2, list[1])
}


0 commentaires