Найти ответы in Java

User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

8K wrote: 27 Nov 2019 23:20
Ну, как же из другой, когда из той же самой. Джависты любят обложиться интерфейсами и конкретными имплементациями, завести factory, controller, manager, что там еще бывает? Я через их код с большим трудом продираюсь. Может, конечно, нехватка опыта сказывается. Они-то, небось, всего этого и не замечают, на автомате делают.
а какие современные языки проще читаются?
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Re: Найти ответы in Java

Post by 8K »

Komissar wrote: 27 Nov 2019 23:59 а какие современные языки проще читаются?
Ну, это не столько от языка зависит, сколько от конкретного человека. Мой фортран был без особых излишеств и вполне себе структурированный и понятный. Соответственно, в отличие от других сотрудников, мне не приходилось тратить кучу времени на отладку.

А с джавой сами понимаете, кто там в первую очередь присутствует.
Увидев друга, Портос вскрикнул от радости...
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

8K wrote: 28 Nov 2019 00:09
Komissar wrote: 27 Nov 2019 23:59 а какие современные языки проще читаются?
Ну, это не столько от языка зависит, сколько от конкретного человека. Мой фортран был без особых излишеств и вполне себе структурированный и понятный.
и мой, и мой! "чистый, как слеза младенца" (с)
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Re: Найти ответы in Java

Post by 8K »

Я сам не так чтобы много языков знаю. Основная проблема во всем этом программировании, что мы не умеем аккуратно описывать динамические процессы и их взаимодействие. Статическая программа (ну, те самые распечатки с АЦПУ) волшебным образом моделирует меняющийся мир.

Возможно, Go немного дальше продвинулся в этом смысле. Ну, типа expressive power.
Увидев друга, Портос вскрикнул от радости...
fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

M. Ridcully wrote: 27 Nov 2019 23:05
ALV00 wrote: 27 Nov 2019 20:40 OMFG. Java is evil
Да пи"№% какой-то.
Надеюсь, что это какой-то прикол?
Приобщение к прекрасному миру джабы "студента". Как бы на примере, brrdrr показывает, что погромирование не только гугление и копипаст, но и нечто большее. Что то типа "добро пожаловать" в сей прекрасный мир. Деньги, тачки, яхты, выкупленный домик в долине, всё это будет, главное удачно жениться, а пока - добро пожаловать в мир ректального программирования.
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

я так и не понял, в чем прикол brrdrr? Можно на джаве проще написать?
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

Можно еще так (после жабы №8). Тут 2 класса. На сортировку я забил.

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.List;
import java.util.Map;
import java.util.stream.Stream;

public class Application {

    public static void main(String[] args) {
        getStreamFromFile("coordinates.json")
                .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>>>() {
                    })
                    .parallelStream()
                    .map(m -> new Record(m.get("id"), m.get("value")));
        } catch (IOException e) {
            e.printStackTrace();
            return Stream.empty();
        }
    }

}

Code: Select all

public class Record {

    final String id;
    final double x, y;

    Record(String id, String value) {
        this.id = id;
        String[] coordinates = value.split(",");
        this.x = Double.parseDouble(coordinates[0]);
        this.y = Double.parseDouble(coordinates[1]);
    }

    double distanceTo(double x, double y) {
        return Math.hypot(this.x - x, this.y - y);
    }

}
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

Плюс за знание библиотек, но с учетом того, что у brrdrr были комментарии и дебаггинг распечатки в коде, у вас ненамного короче получилось, ну и на сортировку вы забили.
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

Komissar wrote: 28 Nov 2019 13:50 Плюс за знание библиотек, но с учетом того, что у brrdrr были комментарии и дебаггинг распечатки в коде, у вас ненамного короче получилось, ну и на сортировку вы забили.
С сортировкой код будет на одну строчку длиннее:

Code: Select all

    public static void main(String[] args) {
        getStreamFromFile("coordinates.json")
                .sorted(Comparator.comparingDouble(r -> r.distanceTo(6, 31))) // <---------------- Тута
                .map(r -> "pivot: " + r.id + ", distance: " + r.distanceTo(6,31))
                .forEach(System.out::println);
    }
Какой практический смысл несут коменты в коде у brrdrr? Дают автору возможность самореализоваться в эпистолярном жанре?
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

Я к тому, что код brrdrr не намного длиннее вашего, если убрать комментарии. После рассказов о невероятной технической крутости вас и вашей команды я, честно, ожидал большего.
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

Вы мне льстите. Я инженер, а не волшебник. ))

У brrdrr метод print делает тоже самоей, что и мой main, но я более экономно отношусь к ресурсам. Я просто очень рачительный инженер. ))

Code: Select all

public static void print(Map<String, Double> map) {
		Map<String, Double> sortedMap = map
				.entrySet()
				.stream()
				.sorted(Comparator.comparing(
						Map.Entry<String, Double>::getValue).thenComparing(
						Map.Entry<String, Double>::getKey))
				.collect(
						Collectors.toMap(Map.Entry::getKey,
								Map.Entry::getValue, (oldV, newV) -> oldV,
								LinkedHashMap::new));
		DecimalFormat df = new DecimalFormat("0.00");

		System.out.println("This is the distance from Origin Point");
		sortedMap.forEach((k, v) -> System.out.println("ID: " + k
				+ "   Distance: " + df.format(v)));

	}
И я могу ошибаться, но читаемость у моего кода должна быть повыше.
fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

tessob wrote: 28 Nov 2019 11:32 Можно еще так (после жабы №8). Тут 2 класса. На сортировку я забил.

Code: Select all


    double distanceTo(double x, double y) {
        return Math.hypot(this.x - x, this.y - y);
    }

.hypot тут зло. :umnik1: Разве нет? А если нужно будет (когда нибудь, ага) фриклентли подсчитывать дистанцию, например когда юзверь елозит пальцем по экрану? (Разве рачительный инженер не подумает об этом?) (см.пост KinDzaDza) Да и не модно так. Модно если бы в distanceTo было 3 nested функции (есть ли они в джабе?) - одна по Пифагору, другая по Пифагору и не извлекающая корень, и третья - Манхэттан. :crazy: Шучу. :fr: :beer:
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Найти ответы in Java

Post by Komissar »

tessob wrote: 28 Nov 2019 14:28 Вы мне льстите. Я инженер, а не волшебник. ))

У brrdrr метод print делает тоже самоей, что и мой main, но я более экономно отношусь к ресурсам. Я просто очень рачительный инженер. ))

Code: Select all

public static void print(Map<String, Double> map) {
		Map<String, Double> sortedMap = map
				.entrySet()
				.stream()
				.sorted(Comparator.comparing(
						Map.Entry<String, Double>::getValue).thenComparing(
						Map.Entry<String, Double>::getKey))
				.collect(
						Collectors.toMap(Map.Entry::getKey,
								Map.Entry::getValue, (oldV, newV) -> oldV,
								LinkedHashMap::new));
		DecimalFormat df = new DecimalFormat("0.00");

		System.out.println("This is the distance from Origin Point");
		sortedMap.forEach((k, v) -> System.out.println("ID: " + k
				+ "   Distance: " + df.format(v)));

	}
И я могу ошибаться, но читаемость у моего кода должна быть повыше.
Насчёт читаемости вы обольщаетесь. Скажу вам из опыта начальника над программистами. Скажем, что-то в программе сбоит и подозрение на ваш кусок кода. Я вызываю свежего выпускника, говорю рррразберись. Так в вашем коде он будет 100 лет ковыряться, а код brrdrr прочтёт с листа. Там немного больше строк, но зато каждая прозрачна, как слеза младенца.
User avatar
brrdrr
Уже с Приветом
Posts: 9563
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

Re: Найти ответы in Java

Post by brrdrr »

tessob wrote: 28 Nov 2019 14:05 С сортировкой код будет на одну строчку длиннее:

Code: Select all

    public static void main(String[] args) {
        getStreamFromFile("coordinates.json")
                .sorted(Comparator.comparingDouble(r -> r.distanceTo(6, 31))) // <---------------- Тута
                .map(r -> "pivot: " + r.id + ", distance: " + r.distanceTo(6,31))
                .forEach(System.out::println);
    }
Умный да? :-)
Ты хоть свои коды через Eclipse пропускаешь?
1. Не работает твоя сортировка от слова совсем.
Что ты в этом выражении «r -> r.distanceTo(6, 31)» с чем сравниваешь?
Чтобы сортировать запись в классе по производимому результату, нужно какой-то носитель создать! Если мы стрим трансформируем в результат, то потеряем «id», так что опять нужно создавать map для «id» и «distanceTo», и вот тогда можно сортировать.
2. У меня без кастов запустить твой код не получилось.
(Collection<Map<String, String>>) new ObjectMapper()
((Map<String, String>) m).get("id"), ((Map<String, String>) m).get("value"))
Даже интересно, как у тебя оно работало?
В общем учись пока дядя Brrdrr дышит.
Вот рабочий вариант:

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.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Application {

	public static void main(String[] args) {
		getStreamFromFile("C:\\coordinates.json")
				.collect(Collectors.toMap(r -> r.id, r -> r.distanceTo(6, 31)))
				.entrySet()
				.stream()
				.sorted(Comparator.comparing(
						Map.Entry<String, Double>::getValue).thenComparing(
						Map.Entry<String, Double>::getKey))
				.collect(
						Collectors.toMap(Map.Entry::getKey,
								Map.Entry::getValue, (oldV, newV) -> oldV,
								LinkedHashMap::new))
				.forEach(
						(k, v) -> System.out.println("pivot: " + k
								+ ", distance: " + v));

	}

	private static Stream<Record> getStreamFromFile(String filename) {
		try {
			return ((Collection<Map<String, String>>) new ObjectMapper()
					.readValue(new File(filename),
							new TypeReference<List<Map<String, String>>>() {
							})).parallelStream().map(
					m -> new Record(((Map<String, String>) m).get("id"),
							((Map<String, String>) m).get("value")));

		} catch (IOException e) {
			e.printStackTrace();
			return Stream.empty();
		}
	}

}

Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
User avatar
M. Ridcully
Уже с Приветом
Posts: 12017
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: Найти ответы in Java

Post by M. Ridcully »

Komissar wrote: 27 Nov 2019 23:59
8K wrote: 27 Nov 2019 23:20
Ну, как же из другой, когда из той же самой. Джависты любят обложиться интерфейсами и конкретными имплементациями, завести factory, controller, manager, что там еще бывает? Я через их код с большим трудом продираюсь. Может, конечно, нехватка опыта сказывается. Они-то, небось, всего этого и не замечают, на автомате делают.
а какие современные языки проще читаются?
Питон, например (как бонус - работает для координат любой размерности, не только 2D):

Code: Select all

import json

def print_closest(filename, origin):
    def dist_squared(pt):
        coords = [float(s) for s in pt['value'].split(',')]
        assert len(coords) == len(origin)
        return sum((c - o) * (c - o) for c, o in zip(coords, origin))
    print(sorted(json.load(open(filename)), key=dist_squared))

print_closest('coordinates.json', (6, 33))
Мир Украине. Свободу России.

Return to “Вопросы и новости IT”