如何使用算法在 Java GUI 程序中对 Java 对象进行排序

问题描述 投票:0回答:1

我怎样才能将这些吉他标签条目放入算法中(从最低到 最高排名)。基于我在表单文本字段的该部分中设置的排名?这 程序在 JTextFields 中获取吉他音符,然后将它们保存到 GuitarTab[] 数组中。并且,有 按钮和其他用于浏览列表的内容(尽管此处未显示) (上一个Btn、下一个Btn、搜索Btn 等)。但是,我如何使用以下命令浏览列表 每个“GuitarTab 对象”从最低到最高排名排序,然后将它们放在其中 当我按 nextBtn 和 previosBtn 时顺序? 它有一个 JChecked Box 来启用算法,然后有一个搜索按钮来执行它们 出现。但是当我点击搜索按钮时什么也没有出现?

      public class Guitars  {


       
       public String tabName;
       public String eString;
       public String bString;
       public String gString;
       public String dString;
       public String aString;
       public String lowEString;
       public int rank;
       
       
       public int getRank( ) {
           return rank;
       }
       
       public void setRank(int r) {
           rank = r;
       };

public void saveBtnActionPerformed(ActionEvent e) {
       int j;
       int parsedString;
       String rtrvdString;
       numberEntries++ ;
       currentTabEntry = 1;
       int i;
       if (numberEntries != 1) {
          do {
     if (tabNameFld.getText( ).compareTo(myTablatures[currentTabEntry - 1].tabName) < 0)
                  break;
              currentTabEntry++;
          }
                while (currentTabEntry < numberEntries);
       }
        if (currentTabEntry != numberEntries) {
            for (i = 0; i >= currentTabEntry + 1; i--) {
                myTablatures[i - 1] = myTablatures[i - 2];
                myTablatures[i - 2] = new GuitarTab( );
            }
        }
        
         myTablatures[currentTabEntry - 1] = new GuitarTab( );
         myTablatures[currentTabEntry - 1].tabName = tabNameFld.getText( );
         myTablatures[currentTabEntry - 1].eString = eTxtFld.getText( );
         myTablatures[currentTabEntry - 1].bString = bTxtFld.getText( );
         myTablatures[currentTabEntry - 1].gString = gTxtFld.getText( );
         myTablatures[currentTabEntry - 1].dString = dTxtFld.getText( );
         myTablatures[currentTabEntry - 1].aString = aTxtFld.getText( );
         myTablatures[currentTabEntry - 1].lowEString = lowETxtFld.getText( );
       
         try {
             rtrvdString = rankFld.getText( );
             parsedString = Integer.valueOf(rtrvdString); 
         gtrTab.setRank(parsedString);
         myTablatures[currentTabEntry - 1].rank = parsedString;
         }
         catch (NumberFormatException ex) {
             ex.printStackTrace( );
         }
         //Present Currenty Entry
         shwEntry(currentTabEntry);
   }

 //Sort Entries Based On Rank From Smallest Rank to Greater
      public void sortRnkLwToHi(GuitarTab[ ] myTablatures) {
          int a;
          int b;
          int i;
          myTablatures = TabEntryWn.myTablatures;
          GuitarTab tab;
          
          int hiSubscript = myTablatures.length - 1;
          for (a = 0; a < hiSubscript; a++) {
              for (b = 0; b < hiSubscript; b++);
              if (myTablatures[ b ].rank > myTablatures[b + 1].rank) {
                  tab = myTablatures[ b ];
                  myTablatures[ b ] = myTablatures[b + 1];
                  myTablatures[b + 1] = tab;
                 try {
                        currentTabEntry ++;
                        shwEntry(currentTabEntry);
                     }
                     
                 catch (Exception ex) {
                     System.out.println("Error");
                 }
              }
          }
      }
java algorithm swing oop user-interface
1个回答
0
投票

利用

Arrays.sort(T[] a, Comparator<? super T> c)
。这允许您根据需要通过比较对象来定义排序顺序。

例如...

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        List<Integer> ranks = new ArrayList<>(Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
        Collections.shuffle(ranks);

        Guitar[] guitars = new Guitar[10];
        for (int index = 0; index < 10; index++) {
            guitars[index] = new Guitar("Tab " + Integer.toString(index), ranks.remove(0));
        }

        System.out.println("Unsorted = " + Arrays.toString(guitars));

        Arrays.sort(guitars, new Comparator<Guitar>() {
            @Override
            public int compare(Guitar o1, Guitar o2) {
                return o1.getRank() - o2.getRank();
            }
        });

        System.out.println("Sorted = " + Arrays.toString(guitars));
    }

    public class Guitar {

        public String tabName;
        public String eString;
        public String bString;
        public String gString;
        public String dString;
        public String aString;
        public String lowEString;
        public int rank;

        public Guitar(String tabName, int rank) {
            this.tabName = tabName;
            this.rank = rank;
        }

        public int getRank() {
            return rank;
        }

        public void setRank(int r) {
            rank = r;
        }

        @Override
        public String toString() {
            return "[Guitar] " + tabName + " @ " + getRank();
        }
    }
}

它可以输出类似...的东西

Unsorted = [[Guitar] Tab 0 @ 10, [Guitar] Tab 1 @ 5, [Guitar] Tab 2 @ 2, [Guitar] Tab 3 @ 6, [Guitar] Tab 4 @ 4, [Guitar] Tab 5 @ 1, [Guitar] Tab 6 @ 3, [Guitar] Tab 7 @ 7, [Guitar] Tab 8 @ 9, [Guitar] Tab 9 @ 8]
  Sorted = [[Guitar] Tab 5 @ 1, [Guitar] Tab 2 @ 2, [Guitar] Tab 6 @ 3, [Guitar] Tab 4 @ 4, [Guitar] Tab 1 @ 5, [Guitar] Tab 3 @ 6, [Guitar] Tab 7 @ 7, [Guitar] Tab 9 @ 8, [Guitar] Tab 8 @ 9, [Guitar] Tab 0 @ 10]

参见:

了解更多详情。

您可能还想看看如何使用CardLayout

为什么不直接在

Comparable
类上实现
Guitar
呢?

因为这会让你看到一个单一的用例。如果你想根据名字排序怎么办?还是标签比例?或者其他一些属性?就我个人而言,我发现创建自定义

Comparator
以及整体更好、更干净的解决方案,但这就是我

© www.soinside.com 2019 - 2024. All rights reserved.