按字符串或索引的一部分对字符串数组进行排序?
Sort an array of strings by a part of the string or index?
我编写了这个程序,它按字母顺序对我的字符串数组进行排序。我希望能够按字符串的不同部分对它进行数字排序。 (我也在使用日食)。
这是我拥有的:
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()
.
的能力
您可以使用 Arrays.sort
对数组进行排序并为其提供自定义比较器。例如,使用 Java 8:
Arrays.sort(age, Comparator.comparingInt(a -> Integer.parseInt(a.split("#")[1])));
虽然此代码有效,但我建议创建一个 class 来封装逻辑。
public class Person {
public static Person decode(String line) {
Matcher matcher = Pattern.compile("(\w+) #(\d+)").matcher(line);
if (!matcher.matches())
throw new IllegalArgumentException("Illegal format");
return new Person(matcher.group(1), matcher.group(2));
}
public int getAge() {...}
public String getName() {...}
}
然后使用流,您的代码可以变得更加明确:
Arrays.stream(age)
.map(Person::decode)
.sorted(Comparator.comparingInt(Person::getAge))
.forEach(...);
我编写了这个程序,它按字母顺序对我的字符串数组进行排序。我希望能够按字符串的不同部分对它进行数字排序。 (我也在使用日食)。 这是我拥有的:
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()
.
您可以使用 Arrays.sort
对数组进行排序并为其提供自定义比较器。例如,使用 Java 8:
Arrays.sort(age, Comparator.comparingInt(a -> Integer.parseInt(a.split("#")[1])));
虽然此代码有效,但我建议创建一个 class 来封装逻辑。
public class Person {
public static Person decode(String line) {
Matcher matcher = Pattern.compile("(\w+) #(\d+)").matcher(line);
if (!matcher.matches())
throw new IllegalArgumentException("Illegal format");
return new Person(matcher.group(1), matcher.group(2));
}
public int getAge() {...}
public String getName() {...}
}
然后使用流,您的代码可以变得更加明确:
Arrays.stream(age)
.map(Person::decode)
.sorted(Comparator.comparingInt(Person::getAge))
.forEach(...);