Вы можете проверить, как это выглядит здесь (размещено на 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
Мобильная версия