View Javadoc
1   /*******************************************************************************
2    * Copyhacked (H) 2012-2025.
3    * This program and the accompanying materials
4    * are made available under no term at all, use it like
5    * you want, but share and discuss it
6    * every time possible with every body.
7    * 
8    * Contributors:
9    *      ron190 at ymail dot com - initial implementation
10   ******************************************************************************/
11  package com.jsql.view.swing.table;
12  
13  import java.util.Comparator;
14  
15  /**
16   * Comparator for table column values ; column with only int data is sorted like 3 lt 20 lt 100,
17   * column with string will sort like 100 gt 20 gt 3 gt abc.
18   */
19  public class ComparatorColumn<T> implements Comparator<T> {
20      
21      /**
22       * Custom compare to sort numbers as numbers.
23       * Strings as strings, with numbers ordered before strings.
24       */
25      @Override
26      public int compare(T cellLeft, T cellRight) {
27          var isFirstNumber = true;
28          var isSecondNumber = true;
29          
30          String valueCellLeft = cellLeft.toString().trim();
31          String valueCellRight = cellRight.toString().trim();
32  
33          try {
34              Long.parseLong(valueCellLeft);
35          } catch (NumberFormatException e) {
36              isFirstNumber = false;
37          }
38          try {
39              Long.parseLong(valueCellRight);
40          } catch (NumberFormatException e) {
41              isSecondNumber = false;
42          }
43          
44          int sortOrder;
45          if (isFirstNumber && isSecondNumber) {
46              sortOrder = Long.valueOf(valueCellLeft).compareTo(Long.valueOf(valueCellRight));  // or Sort by Number
47          } else if (isFirstNumber) {
48              sortOrder = -1;  // or Sort by Number first
49          } else if (isSecondNumber) {
50              sortOrder = 1;  // or Sort by Letter first
51          } else {
52              sortOrder = valueCellLeft.compareToIgnoreCase(valueCellRight);  // Sort by Letter
53          }
54          return sortOrder;
55      }
56  }