Wątek przeniesiony 2023-06-21 18:07 z Kariera przez MarekR22.

sortowanie listy wg zadanych kryteriow

0

W jaki sposob posortowac liste wg zadanej kolejnosci z drugiej listy

Lista<Integer> kolejnosc  = List.of(4,6,1,3,2);
List<Test> listaDoPosortowania = List.of(new Test("name1", 2 ), new Test("name2", 3), new Test("name3", 4));

Wynik:

new Test("name3", 4)) , new Test("name2", 3), new Test("name1", 2 )
0

a w javie czy jezyk dowolny, skoro dzial niejavovy?

0

Skoro już zobaczyłem to pytanie (przypadkiem bo w dziale kariera) to może odpiszę ale nie wiem czy o to chodzi.

    public static void main(String... args) {
        final var kolejnosc = List.of(3, 1, 2);
        final var listaDoPosortowania = List.of(1, 2, 3);

        final var listaPosortowana = new ArrayList<Integer>();

        for (int idx : kolejnosc) {
            listaPosortowana.add(listaDoPosortowania.get(idx));
        }

        System.out.println("Posortowania lista: " + listaPosortowana);
    }
0

W normalnym języku zrobił bym to tak:

case class Test(name: String, value: Int)

val kolejnosc  = List(4,6,1,3,2)
val listaDoPosortowania = List(new Test("name1", 2 ), new Test("name2", 3), new Test("name3", 4))

val zipped = kolejnosc.zip(listaDoPosortowania)
val sorted = zipped.sortBy(_._1)
val result = sorted.map(_._2)

println(result)

A w jednej linii:

kolejnosc.zip(listaDoPosortowania).sortBy(_._1).map(_._2)

XD

pytanie jak to teraz zapisac w Javie

import java.util.*;
import java.util.stream.*;
public class WriteOnlyPl {
  public record Test(String name, int value) {
  }
  //Normalny język ma krotki, ale to java. Mam jakiś problem z generykami to typy wbiłem na sztywno
  public record Tuple2(Integer t1, Test t2) {
  }
    
  public static void main(String args[]) {
    var kolejnosc = List.of(4,6,1,3,2);
    var listaDoPosortowania = List.of(new Test("name1", 2 ), new Test("name2", 3), new Test("name3", 4));
    
    // kszywy zip. W kodzie produkcyjnym albo użyłbym do tego biblioteki, albo napisał swój iterator
    var zipped = IntStream
      .range(0, Math.min(kolejnosc.size(), listaDoPosortowania.size()))
      .mapToObj(i -> new Tuple2(kolejnosc.get(i), listaDoPosortowania.get(i))).toList();

    //generyki się sypały na `Comparator.comparing(it -> it.t1)`. Pewnie trzeba tu dodac rzutawanie gdzieś
    var sorted = zipped.stream().sorted(Comparator.comparing(it -> it.t1)).toList();
    var result = sorted.stream().map(it -> it.t2).toList();

    System.out.println(result);
  }
}

kurde co za straszny język

BTW wiem że robie za dużo konwersji Stream <-> Lista, ale chciałem tylko pozkazać zamysł

1
        List<Integer> order = List.of(4, 6, 1, 3, 2);
        List<Test> toSortList = List.of(new Test("name1", 2 ), new Test("name2", 3), new Test("name3", 4));


        List<Test> sortedList = new ArrayList<>(toSortList);
        sortedList.sort(Comparator.comparingInt(test -> order.indexOf(test.getOrder()))); // -> 2 wartość

        System.out.println(sortedList);
0
waran88 napisał(a):

Skoro już zobaczyłem to pytanie (przypadkiem bo w dziale kariera) to może odpiszę ale nie wiem czy o to chodzi.

    public static void main(String... args) {
        final var kolejnosc = List.of(3, 1, 2);
        final var listaDoPosortowania = List.of(1, 2, 3);

        final var listaPosortowana = new ArrayList<Integer>();

        for (int idx : kolejnosc) {
            listaPosortowana.add(listaDoPosortowania.get(idx));
        }

        System.out.println("Posortowania lista: " + listaPosortowana);
    }

Dostaje tak .
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

A tak ?
listaPosortowana.add(listaDoPosortowania.get(idx-1));

1 użytkowników online, w tym zalogowanych: 0, gości: 1