我已经编写了该程序,并在其中按字母顺序对字符串数组进行排序。我希望能够按数字的不同部分对字符串进行排序。 (我也在使用eclipse)。
这是我所拥有的:

import edu.princeton.cs.algs4.Merge;

public class sortNum {

    public static void main(String[] args) {
    // TODO Auto-generated method

    String[] age = {"Meredith Chicago #82",
            "Brian Phoenix #45", "Jess Miami #26",
            "Gunther NYC #53", "Frank Boise #4"};

    System.out.println("-----------------------------");

    //loop through array and print out unsorted string

    for(String i : age){
        System.out.printf("%25s\n", i); //to right-align

    }

    System.out.println("-----------------------------");

    Merge.sort(age);

    //loop through array and print sorted string

    for(String j: age){
        System.out.println(j); //this is where I am unsure of the right way
    }



    System.out.println("-----------------------------");
  }

}


对于输出,我得到以下信息:

-----------------------------
     Meredith Chicago #82
        Brian Phoenix #45
           Jess Miami #26
          Gunther NYC #53
           Frank Boise #4
-----------------------------
Brian Phoenix #45
Frank Boise #4
Gunther NYC #53
Jess Miami #26
Meredith Chicago #82
-----------------------------


显然这是由于它查看字符串的开头。这不是问题,当然是预料之中的。

我可以将其设置为查看数字的位置吗?可以通过计算索引来完成吗?举例来说,从末尾(#)索引算起但不包括-1并以此排序?当然,升序排列。我仍在寻找使用for循环。

通过为每条信息创建单独的对象,我本来可以没有循环的,但是后来意识到这将是永远的,并且会有太多的代码。

最佳答案

我建议您为此类数据创建单独的对象,如下所示:

public class User implements Comparable<User> {
  private int mId;
  private String mName;

  public User(final int id, final String name) {
    mId = id;
    mString = name;
  }

  public String getName() {
    return mName;
  }

  @Override
  public int compare(final User lhs, final User rhs) {
    return Integer.compare(lhs.mId, rhs.mId);
  }

  @Override
  public String toString() {
    return String.format("%s #%d", mName, mId);
  }
}


在这里,我实现了Comparable<User>,您可以根据需要覆盖比较类型。在这里,我只是比较ID上的用户。
之后,您可以根据需要使用Collections.sort(List<User>)Merge.sort(Comparable[]),它们将被排序。同样,覆盖的toString()方法提供了将用户信息简单地输出为user.toString()的功能。

09-10 03:20
查看更多