BitNeBolt
@BitNeBolt

Почему на питоне работает, а на Java — нет?

Есть метод, который должен упорядочивать точки в новом массиве по увеличению расстояния от первой, выбранной точки.

Вот что на питоне:
Питон

points = []
	sorted_list = []
	INF = 999

	def findClosestPointIndex(self, point):
		best_distance = self.INF
		best_index = -1

		for i in range(len(self.points)):
			current_point = self.points[i]
			if (not current_point.visited):
				distance = current_point.distanceTo(point)

				if (distance < best_distance):
					best_distance = distance
					best_index = i

		print("Closest to " + point.buildStr() + " is: " + self.points[best_index].buildStr())

		if (best_index != -1):
			self.points[best_index].visited = True
			self.sorted_list.append(self.points[best_index])
			self.findClosestPointIndex(self.points[best_index])

		return best_index

	def main(self):
		points_count = int(input("Enter points count: "))

		for i in range(points_count):
			self.points.append(Point(random.randint(0, 9), random.randint(0, 9)))

		start_point = self.points[0]
		start_point.visited = True
		self.sorted_list.append(start_point)
		self.findClosestPointIndex(start_point)

		print("Source list: ")
		for point in self.points:
			print(point.buildStr())

		print("Sorted list:")
		for point in self.sorted_list:
			print(point.buildStr())

		print("Finished.")



Вот что на Java:
Java

private void findBestAndAdd(Vector3 point)
    {
        double bestDistance = Double.MAX_VALUE;
        int bestIndex = -1;

        for (int i = 0; i < points.size(); i++)
        {
            Vector3 currentPoint = points.get(i);

            if (! currentPoint.visited)
            {
                double distance = Vector3.distanceBetween(point, currentPoint);

                if (distance < bestDistance)
                {
                    bestDistance = distance;
                    bestIndex = i;
                }
            }
        }

        if (bestIndex != -1)
        {
            Vector3 bestPoint = points.get(bestIndex);

            bestPoint.visited = true;
            sortedPoints.add(bestPoint);
            findBestAndAdd(bestPoint);
        }
    }

    public void sortPoints()
    {
        System.out.println("Array before sort:");
        for (Vector3 point : points)
            System.out.println(point.toString());

        Vector3 startPoint = points.get(0);
        startPoint.visited = true;
        sortedPoints.add(startPoint);

        findBestAndAdd(startPoint);

        this.points = sortedPoints;

        System.out.println("Array after sort:");
        for (Vector3 point : points)
            System.out.println(point.toString());
    }



Вот результаты при входных данных:
Python

Входные:
Source list:
8;9
2;0
6;0
9;8


Выходные:
Sorted list:
8;9
9;8
6;0
2;0



Java

Входные:
Array before sort:
3.2060296130482615 ; 15.364776819179262 ; 0.0
2.9060809054810197 ; 14.744574242841 ; 0.0
2.9060809054810197 ; 14.744574242841 ; 30.0
3.2060296130482615 ; 15.364776819179262 ; 30.0


Выходные:
Array after sort:
3.2060296130482615 ; 15.364776819179262 ; 0.0
3.2060296130482615 ; 15.364776819179262 ; 30.0
2.9060809054810197 ; 14.744574242841 ; 30.0



Почему на питоне оно правильно (как мне надо) работает, а на Java - нет.
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dmshar
Вы в чудеса верите? Если нет - то ответ тривиален - потому, что скрипте на Java ошибка. Вы же оба кода сами писали? И отлаживали при написании. Вот аккуратненько, пошагово и проходимся по обеим программулькам и ищем, где возникает отличие.
P.S. Кстати, а почему вы тестируете скрипты на разных входных данных? Причем абсолютно разных - даже по количеству элементов (координат???) в объекте. Для начала посмотрите, как они сработают на одинаковых. А уже потом принимайте решение.
И еще - а что неправильного в результатах, выданных Java-скриптом? По-моему, вполне адекватный результат сортировки по отношению к первому элементу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы