Визуально сортируйте массив с помощью Rectangles из JFXJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Визуально сортируйте массив с помощью Rectangles из JFX

Сообщение Anonymous »

Я пытаюсь создать средство просмотра алгоритмов, в котором я генерирую случайный массив и связываю его со списком прямоугольников, размер которых определяется их значением в массиве, а затем сортирую их (используя метод пузырька), но прямоугольники не переворачиваются должным образом, когда я сравниваю их значения.
Вы можете проверить, как это выглядит здесь (размещено на Giphy, я не смог загрузить свою гифку напрямую, не знаю почему):
через GIPHY
Чтобы решить проблему, первым решением было не сравнивать их позиции X (потому что это не сработало по неизвестной причине), а сравнить их размеры, и это сработало отлично, но это был не ожидаемый результат (поскольку я хочу поменять их позиции, а не их размеры).
Поэтому, учитывая, что сравнение позиций не работает, я решил назначить каждому прямоугольнику присваивается значение, представляющее их в зависимости от их размера, с помощью setUserData, затем сравнивается, какой прямоугольник получил самые большие пользовательские данные, а затем меняется местами, но прямоугольники продолжают плохо инвертироваться.
Вот мой класс
Вот мой класс р>

Код: Выделить всё

public class MainView extends Pane {

public int arrayMax             = 500;
public int arraySize            = 15;
public int[] array              = new int[arraySize];
public Random rdm               = new Random();

public MainView() {
ObservableList comp     = this.getChildren();

ToggleGroup radioGroup  = new ToggleGroup();
RadioButton bubbleSort  = new RadioButton("Bubble Sort");
bubbleSort.setUserData("BubbleSort");
bubbleSort.setToggleGroup(radioGroup);
bubbleSort.setTranslateX(850);

Text str                = new Text("Text");
Text output             = new Text();
Font stencil            = new Font("Caladea",24);
str.setFont(stencil);
output.setFont(stencil);
output.setX(500);
output.setY(500);

// Here I generate my random array
Rectangle[] rects       = new Rectangle[arraySize];
for(int i = 0; i < array.length; i++) {
array[i] = rdm.nextInt(0, arrayMax);

rects[i] = new Rectangle();
rects[i].setWidth(20);
rects[i].setHeight(array[i]);
// Here I define user data
rects[i].setUserData(array[i]);
rects[i].setX(i*30);
rects[i].setY(0);

comp.addAll(rects[i]);

output.setText(Arrays.toString(array));
}

for(Rectangle r : rects) {
r.setAccessibleText(r.getUserData().toString());
r.setOnMouseClicked(new EventHandler() {
@Override
public void handle(MouseEvent e) {
System.out.println("[XPOS: " + r.getX() +"]" + "[USERDATA : " + r.getUserData() + "]");
}
});
}

Button btnStart         = new Button("Start");
btnStart.setTranslateX(600);
btnStart.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent e) {
if(radioGroup.getSelectedToggle() != null) {
//TODO: Using switch instead of if
switch(radioGroup.getSelectedToggle().getUserData().toString()) {
case "BubbleSort":
int a = array.length;
int n = rects.length;

bubbleSort(array,a);
// System.out.println("\nBubble Sorted array:");
// printArray(array,n);
output.setText(Arrays.toString(array));

boolean swapped = false;
int i,j;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1;  j++) {
int r1 = ((Integer) rects[j].getUserData()).intValue();
int r2 = ((Integer) rects[j+1].getUserData()).intValue();
// Here I try to compare userdata
if (r1>r2) {
// if(rects[j].getX() > rects[j+1].getX()) => Not working at ALL ?
// if(rects[j].getHeight() > rects[j+1].getHeight()) { => Working perfectly fine but not the way i wanna swap rects
swapRectsPos(rects[j], rects[j+1]);
swapped = true;
}
}
if(swapped==false)
break;
}
output.setText(Arrays.toString(array));
default:
break;
}
} else {
str.setText("U need to specify option!");
}
}
});

// TODO: Adding Str
comp.addAll(btnStart, bubbleSort, output);
}

// TODO : repaint/animation method

static void swapRectsPos(Rectangle r1, Rectangle r2) {
//System.out.println("First rect : " + x.getX() + " Second rect :" + y.getX());

// Swapping size, not positions, so not finished
int temp = (int) r1.getX();
r1.setX(r2.getX());
r2.setX(temp);
}

static void swapRectsSize(Rectangle r1, Rectangle r2) {
System.out.println("First rect : " + r1.getX() + " Second rect :" + r2.getX());

// Swapping positions, bug causing bug where rects dont swap correctly
int temp = (int) r1.getHeight();
r1.setHeight(r2.getHeight());
r2.setHeight(temp);
}

static void bubbleSort(int arr[], int n) {
int i, j, temp;
boolean swapped;
for(i = 0; i < n - 1; i++) {
swapped=false;
for(j = 0; j < n - i - 1; j++) {
if(arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swapped=true;
}
}

if(swapped==false)
break;
}
}
Надеюсь, мой пост будет хорошо продуман и не разочарует, заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/789 ... s-from-jfx
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»