brrdrr wrote: ↑28 Nov 2019 20:46
Умный да?
Ты хоть свои коды через Eclipse пропускаешь?
Не, не проверял, не было возможности. Просто дописал сортировку по памяти из переговорки во время митинга. Чтоб сортировка заработала корректно нужно поменять parallelStream() на stream().
В параллельных стримах сортировка имеет смысл только (вроде) перед вызовом коллектора. Я думал, что это очевидно, поэтому и не стал весь класс еще раз выкладывать.
Для работы нужны такие зависимости:
Code: Select all
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
Полностью работающий класс с сортировкой:
Code: Select all
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
public class Application {
public static void main(String[] args) {
getStreamFromFile("coordinates.json")
.sorted(Comparator.comparingDouble(a -> a.distanceTo(6, 31)))
.map(r -> "pivot: " + r.id + ", distance: " + r.distanceTo(6,31))
.forEach(System.out::println);
}
private static Stream<Record> getStreamFromFile(String filename) {
try {
return new ObjectMapper()
.readValue(new File(filename), new TypeReference<List<Map<String, String>>>() {
})
.stream()
.map(m -> new Record(m.get("id"), m.get("value")));
} catch (IOException e) {
e.printStackTrace();
return Stream.empty();
}
}
}
Вывод в stdout будет таким:
Code: Select all
pivot: a, distance: 18.681541692269406
pivot: d, distance: 20.518284528683193
pivot: z, distance: 26.076809620810597
pivot: t, distance: 29.732137494637012
pivot: o, distance: 30.265491900843113
...
brrdrr wrote: ↑28 Nov 2019 20:46
Что ты в этом выражении «r -> r.distanceTo(6, 31)» с чем сравниваешь?
Чтобы сортировать запись в классе по производимому результату, нужно какой-то носитель создать! Если мы стрим трансформируем в результат, то потеряем «id», так что опять нужно создавать map для «id» и «distanceTo», и вот тогда можно сортировать.
Там же функтор можно поставить. Вот я и поставил.
З.Ы. Если совсем ничего не компилируется и не запускается, то я могу просто репозиторий выложить куда-нибудь.