С моей точки зрения, ваш код работает, но вы можете внести некоторые улучшения:
- Вы можете исследовать верхнюю и нижнюю границы одновременно, а левую и правую границы нав то же время, чтобы избежать дополнительных циклов.
- Хотя
set
гарантирует отсутствие повторных местоположений, вы также можете избежать их изучения. Таким образом, при добавлении левой / правой границ вы можете начинать с позиции + 1 и заканчивать на позиции - 1.
Вот код:
Set<Location> borderCoordinates = new HashSet<>();
Rectangle center = World.getRectangle(1363, 1370, 10264, 10271); //these values are dynamic
for (int x = (int) center.getMinX(); x <= (int) center.getMaxX(); x++) {
// Add north and south borders
borderCoordinates.add(new Location(x, (int) center.getMinY()));
borderCoordinates.add(new Location(x, (int) center.getMaxY()));
}
for (int y = (int) center.getMinY() + 1; y < (int) center.getMaxY() - 1; y++) {
// Add west and east borders
borderCoordinates.add(new Location((int) center.getMinX(), y));
borderCoordinates.add(new Location((int) center.getMaxX(), y));
}
Также,если вы используете Java 8, вы можете использовать лямбды и / или потоки. Производительность будет немного хуже, но код может показаться более выразительным (декларативным) и компактным. Вот код:
Stream<Location> s1 = IntStream.range((int) center.getMinX(), (int) center.getMaxX()).mapToObj(x -> new Location(x, (int) center.getMinY()));
Stream<Location> s2 = IntStream.range((int) center.getMinX(), (int) center.getMaxX()).mapToObj(x -> new Location(x, (int) center.getMaxY()));
Stream<Location> s3 = IntStream.range((int) center.getMinY() + 1, (int) center.getMaxY() - 1).mapToObj(y -> new Location((int) center.getMinX(), y));
Stream<Location> s4 = IntStream.range((int) center.getMinY() + 1, (int) center.getMaxY() - 1).mapToObj(y -> new Location((int) center.getMaxX(), y));
Set<Location> borderCoordinates = Stream.concat(s1, Stream.concat(s2, Stream.concat(s3, s4))).collect(Collectors.toSet());
Также, в этом вопросе вы можете найти расширенное сравнение между потоками и для циклов.