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

tessob
Уже с Приветом
Posts: 576
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: 145
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: 65208
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: 9560
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: 12003
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))
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

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

Post by tessob »

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», и вот тогда можно сортировать.
Там же функтор можно поставить. Вот я и поставил.

З.Ы. Если совсем ничего не компилируется и не запускается, то я могу просто репозиторий выложить куда-нибудь.
KinDzaDza
Уже с Приветом
Posts: 2311
Joined: 29 Jul 2005 17:39
Location: Калифорнийский Мухосранск

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

Post by KinDzaDza »

А попроще на Java разве нельзя было написать? Кложуры и функторы это конечно круто но нахрена нам это все тут?

Code: Select all

public static class Point {
  public String id;
  public int x;
  public int y;
  public int distance;
  public Point(String id, int x, int y) { this.id = id; this.x = x; this.y = y; this.distance = 0; }
}

List<Point> points = getPoints("coordinates.json"); // see below for implementation details, they are actually irrelevant to the task we are solving here. 
Point origin = new Point("Origin", 12, 34);
// calculate distance
for(Point point : points) {
  int x = origin.x - point.x;
  int y = origin.y - point.y;
  point.distance = x*x + y*y; // add Math.sqrt() if you want
}
// sort by distance
Collections.sort(points, new Comparator<Point>() { int compare(Point a, Point b) { return a.distance - b.distance; } } );
// print them sorted
for(Point point : points) {
  System.out.println(point.id);
}

List<Point> getPoints(String fileName) {
  List<Point> points = new ArrayList<>();
  // ...
  // use your favorite JSON library here like GSON, Jackson, SimpleJson etc,
  // or if you are really cool parse file manually
  // ...
  // 
  // iterate through all records in this file and 
  // for each record from the file add new Point(id, x, y) object to the points list.
  //
  return points;
}
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

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

Post by brrdrr »

Стрим в Java вещь новая и ещё толком непонятно, когда она реально необходима. Вроде разгружает процесс написания кода, но жутко напрягает железо.
А так чем проще пишешь, тем быстрее ездит, и проще находить проблемы.
Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

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

Post by brrdrr »

KinDzaDza wrote: 29 Nov 2019 21:59 А попроще на Java разве нельзя было написать? Кложуры и функторы это конечно круто но нахрена нам это все тут?
Задачка простая как тест на владение загрузкой JSON.
Я старался создавать минимум объектов.
Но раз вы решили создавать 26 объектов класса Point, то зачем его делать статическим? Да и метод по расчёту дистанции тогда нужно запихать в этот класс.
Я бы так переписал ваш класс. (заранее извиняюсь, что посмел дотронуться до шедевра)

Code: Select all

public class Point {
		private final String id;
		private final int x;
		private final int y;
		private double distance;

		public Point(String id, int x, int y) {
			this.id = id;
			this.x = x;
			this.y = y;
			this.distance = 0;
		}

		/**
		 * @return the id
		 */
		public String getId() {
			return id;
		}

		/**
		 * @return the x
		 */
		public int getX() {
			return x;
		}

		/**
		 * @return the y
		 */
		public int getY() {
			return y;
		}

		/**
		 * @return the distance
		 */
		public double getDistance() {
			return distance;
		}

		/**
		 * @param distance calculation from origin point x and y to paticualr point
		 */
		public double calDistance(int x, int y) {
			return this.distance = StrictMath.hypot(this.x - x, this.y - y);
		}

	}

Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

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

Post by tessob »

KinDzaDza wrote: 29 Nov 2019 21:59А попроще на Java разве нельзя было написать? Кложуры и функторы это конечно круто но нахрена нам это все тут?
Если Вы допишете свой код до рабочего состояния, то он получится значительно длиннее моего. Просто, если бы JSON был разумнее организован, без двух значений в поле value, то я бы написал это и без дополнительного класса. Вы же эту проблему совсем опустили. Опять же, если мы прогоним потом наш код каким-либо линтером, вроде того, что в Idea, то он развернет все ваши однострочные конструкторы и компараторы. Так-то я тоже могу записать все в одну строку, которая будет и не читаемая, и не поддерживаемая.
brrdrr wrote: 30 Nov 2019 00:29Я бы так переписал ваш класс...
Вот это вот - очень порочная практика:

Code: Select all

public class Point {

  private double distance;

  public double getDistance() 

  public double calDistance(int x, int y)
		
}
Вы когда вызываете getDistance у подобных классов, всегда уверены к какому именно состоянию Вы обращаетесь и дистанцию до чего получите? Например, если придется обрабатывать подобные классы многопоточно, как элемент разделяемой памяти. Если Вы так сильно хотите сэкономить на двойном вычислении дистанции, для сортировки и для печати, то почему не создать отдельный иммутабельный класс для этого, где вы будете хранить то состояние, которое вам нужно для печати. Это не Вам упрек, а скорее напутствие автору топика и тем, кто его просматривает, чтоб почерпнуть знания.
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

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

Post by brrdrr »

tessob wrote: 30 Nov 2019 01:22
Вот это вот - очень порочная практика:

Code: Select all

public class Point {

  private double distance;

  public double getDistance() 

  public double calDistance(int x, int y)
		
}
Вы когда вызываете getDistance у подобных классов, всегда уверены к какому именно состоянию Вы обращаетесь и дистанцию до чего получите? Например, если придется обрабатывать подобные классы многопоточно, как элемент разделяемой памяти. Если Вы так сильно хотите сэкономить на двойном вычислении дистанции, для сортировки и для печати, то почему не создать отдельный иммутабельный класс для этого, где вы будете хранить то состояние, которое вам нужно для печати. Это не Вам упрек, а скорее напутствие автору топика и тем, кто его просматривает, чтоб почерпнуть знания.
С этим я согласен, для параллельной работы этот класс не годится. Стало быть ещё един класс с 26 новыми объектами.
Невольно возникает вопрос: а зачем тогда стрим с параллельной работой, если старый добрый метод работает быстрее?
Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

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

Post by tessob »

brrdrr wrote: 30 Nov 2019 13:42Невольно возникает вопрос: а зачем тогда стрим с параллельной работой, если старый добрый метод работает быстрее?
Параллельные стирмы удобны во всяких middleware workers, например когда вам нужно разгребать очередь сообщений, вроде Kafka или SQS, и для каждого сообщения нужно ходить в разные базы, что-нибудь валидировать, общаться с другими сервисами и потом все это заталкивать в какой-нибудь NoSQL. Параллельные стримы в подобных случаях будут выполняться полностью асинхронно для каждого из элементов, используя общий форк-джойн пул. В результате, пока одни "таски" будут спать, ожидая ответа другого сервера, остальные будут что-то делать. С обычным стримом у вас все "таски" будут ждать пока не выполнятся все предыдущие.
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

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

Post by brrdrr »

tessob wrote: 30 Nov 2019 19:48
brrdrr wrote: 30 Nov 2019 13:42Невольно возникает вопрос: а зачем тогда стрим с параллельной работой, если старый добрый метод работает быстрее?
Параллельные стирмы удобны во всяких middleware workers, например когда вам нужно разгребать очередь сообщений, вроде Kafka или SQS, и для каждого сообщения нужно ходить в разные базы, что-нибудь валидировать, общаться с другими сервисами и потом все это заталкивать в какой-нибудь NoSQL. Параллельные стримы в подобных случаях будут выполняться полностью асинхронно для каждого из элементов, используя общий форк-джойн пул. В результате, пока одни "таски" будут спать, ожидая ответа другого сервера, остальные будут что-то делать. С обычным стримом у вас все "таски" будут ждать пока не выполнятся все предыдущие.
Какую-нибудь хорошую книжку по стримам Java 8 можете посоветовать?
Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
KinDzaDza
Уже с Приветом
Posts: 2311
Joined: 29 Jul 2005 17:39
Location: Калифорнийский Мухосранск

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

Post by KinDzaDza »

brrdrr wrote: 30 Nov 2019 00:29
KinDzaDza wrote: 29 Nov 2019 21:59 А попроще на Java разве нельзя было написать? Кложуры и функторы это конечно круто но нахрена нам это все тут?
Задачка простая как тест на владение загрузкой JSON.
Я старался создавать минимум объектов.
Но раз вы решили создавать 26 объектов класса Point, то зачем его делать статическим? Да и метод по расчёту дистанции тогда нужно запихать в этот класс.
Я бы так переписал ваш класс. (заранее извиняюсь, что посмел дотронуться до шедевра)

Code: Select all

public class Point {
		private final String id;
		private final int x;
		private final int y;
		private double distance;

		public Point(String id, int x, int y) {
			this.id = id;
			this.x = x;
			this.y = y;
			this.distance = 0;
		}

		/**
		 * @return the id
		 */
		public String getId() {
			return id;
		}

		/**
		 * @return the x
		 */
		public int getX() {
			return x;
		}

		/**
		 * @return the y
		 */
		public int getY() {
			return y;
		}

		/**
		 * @return the distance
		 */
		public double getDistance() {
			return distance;
		}

		/**
		 * @param distance calculation from origin point x and y to paticualr point
		 */
		public double calDistance(int x, int y) {
			return this.distance = StrictMath.hypot(this.x - x, this.y - y);
		}

	}

Да что Вы, какой тут шедевр, ни гетеров, ни сеттеров, ни новомодных функторов. Но позвольте с Вами тут в паре-тройке моментов немножко не согласиться.
Класс Point пофиг как объявить, если вложенный, то лучше статическим, чтобы потом можно было использовать ещё где.
Класс Point написан именно так потому что эти геттеры и сеттеры тут ну нахрен никому не уперлись в принципе, это простой и тупой дата холдер.
Создавать 26 объектов класса Point это не комильфо, а плодить на лету два хэшмапа каждый с 26 парами объектов и хрен знает чем ещё для своего внутреннего использования - это типа гораздо лучше.
User avatar
Komissar
Уже с Приветом
Posts: 65208
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

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

Post by Komissar »

Как страшно жить! (c)
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

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

Post by tessob »

brrdrr wrote: 01 Dec 2019 00:22Какую-нибудь хорошую книжку по стримам Java 8 можете посоветовать?
Я обычно не читаю книжки по новым возможностям языков, так как к моменту их публикации возможности становятся уже не новыми. Мой основной источник информации -- это записи с конференций и блоги. Могу посоветовать посмотреть на ютубе видео Сергей Куксенко по "Stream API". Тагир Валеев тоже неплохо рассказывал.
iDesperado
Уже с Приветом
Posts: 1422
Joined: 28 Nov 2008 17:50

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

Post by iDesperado »

brrdrr wrote: 01 Dec 2019 00:22 Какую-нибудь хорошую книжку по стримам Java 8 можете посоветовать?
Modern Java in Action: Lambdas, streams, functional and reactive programming
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

Komissar wrote: 01 Dec 2019 02:39 Как страшно жить! (c)
You don't say! Duff's device:

Code: Select all

send(to, from, count)
register short *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }
}
Увидев друга, Портос вскрикнул от радости...
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

Some things are just hilarious.
Beyond Floating Point: Next-Generation Computer Arithmetic
phpBB [video]
by John L. Gustafson.
Увидев друга, Портос вскрикнул от радости...
User avatar
brrdrr
Уже с Приветом
Posts: 9560
Joined: 26 Mar 2011 23:02
Location: Russia -> Orlando, FL

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

Post by brrdrr »

Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Так решение выглядит без стрима.

Code: Select all

public class Solution {
    static int minimumAbsoluteDifference(int[] arr) {
        int min = Integer.MAX_VALUE;
        Arrays.sort(arr);
        for( int i = 0; i < arr.length - 1; i++){
                min = Math.min(Math.abs(arr[i] - arr[i + 1]), min);                     
            }
    return min;
    }
Я пытался полностью реализовать эту задачу в стриме, но не получилось.
Можно ли сортировку воткнуть в стрим?

Code: Select all

public class Solution {
    static int minimumAbsoluteDifference(int[] arr) {
       Arrays.sort(arr);
        return IntStream.range(0, arr.length - 1)
                .mapToObj(i -> Math.abs(arr[i + 1] - arr[i]))
                .min(Integer::compare).get(); 
    }
Человек никогда не бывает так несчастен, как ему кажется, или так счастлив, как ему хочется. (Франсуа де Ларошфуко)
fleshold
Уже с Приветом
Posts: 145
Joined: 29 Apr 2014 12:22

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

Post by fleshold »

dup
Last edited by fleshold on 20 Dec 2019 14:18, edited 1 time in total.
fleshold
Уже с Приветом
Posts: 145
Joined: 29 Apr 2014 12:22

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

Post by fleshold »

brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Так решение выглядит без стрима.

Code: Select all

public class Solution {
    static int minimumAbsoluteDifference(int[] arr) {
        int min = Integer.MAX_VALUE;
        Arrays.sort(arr);
        for( int i = 0; i < arr.length - 1; i++){
                min = Math.min(Math.abs(arr[i] - arr[i + 1]), min);                     
            }
    return min;
    }
А если на i = 0 получим min = 0 зачем бежать дальше? :pain1:
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

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

Post by tessob »

Можно так:

Code: Select all

public class Solution {

    public static void main(String[] args) {
        var test = new int[]{1, 10, 12, 30};
        System.out.println(solve(test)); // 2
    }

    public static int solve(int[] arr) {
        IntFunction<Integer> fn = (i) -> Math.abs(arr[i] - arr[i + 1]);
        return IntStream.range(0, arr.length - 1).map(fn::apply).min().orElseThrow();
    }

}
UPD:
Я короче, перечитал и понял, что вопрос был про сортировку. Это сделать можно, создав отдельный класс, который содержит указатель на массив и на позицию в этом массиве. Далее просто реализовать два метода:
- один, возвращающий значение массива
- второй, возвращающий разницу до следующего элемента

Только это в принципе плохая идея, когда элементы стрима знают друг о друге. Сортировка стрима тоже не особо хорошая идея во многих случаях, т.к. параллельный стрим не может быть отсортированным.
first1

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

Post by first1 »

Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
KinDzaDza
Уже с Приветом
Posts: 2311
Joined: 29 Jul 2005 17:39
Location: Калифорнийский Мухосранск

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

Post by KinDzaDza »

Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
Ну и еше весьма интересным получается значение минимальной разницы для массивов типа таких { Integer.MIN_VALUE + 100, Integer.MAX_VALUE - 100 }.

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