タイトル:例えばディレクトリ特定の書籍に文字列ソートディレクトリ、以下に示すように、例えば1などの最初の記事、まず、第1章1.1、第二章1.2に第一、第二〜第カタログアレイ(カスタム)の束がある場合は、セクション1.1.1には、第二は2、...、パートIV章II 4.2.1項は、チャプターです混乱である、ことによってそれを送ってください昇順に並んで。
この質問を考えることは非常に簡単で、キーは文字列のソート番号配列することができバブルソートや選択ソートして、後で少し取得者偉大である2つの文字列のサイズを決定することです。
方法の一つ:私は書いています。
import java.time.LocalDateTime;
import java.util.Arrays;
/**
* 字符串目录排序
*
* @author zql
*/
public class Catalog {
public static void main(String[] args) {
Catalog c = new Catalog();
String[] str = new String[] { "2", "1.1.2", "2.1", "1", "2.1.4", "1.1", "3.2", "3", "2.1.3", "1.1.1", "1.1.1.1", "2.3" };
System.out.println("排序前的目录:" + Arrays.toString(str));
str = c.sortStr(str);
System.out.println("排序后的目录:" + Arrays.toString(str));
}
/**
* 通过选择排序对数组进行排序
*
* @param str 要进行排序的数组
* @return 排序后的数组
*/
public String [] sortStr(String [] str) {
String temp = null;
for (int i = 0; i < str.length - 1; i++) {
for (int j = i + 1; j < str.length; j++) {
if (compareSize(str[i], str[j])) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
return str;
}
/**
* 本方法要比较的是str1与str2的大小
*
* @param str1 要比较的第一个字符串
* @param str2 要比较的第二个字符串
* @return str1大于str2则返回true;反之,则返回false。
*/
private boolean compareSize(String str1, String str2) {
// 注意点要用转译字符\\
String[] s1 = str1.split("\\.");
String[] s2 = str2.split("\\.");
// 求出数组长度最短的大小
int min = s1.length > s2.length ? s2.length : s1.length;
int[] a1 = new int[min];
int[] a2 = new int[min];
// 把分开的字符串数组的每一个字符转成int类型
for (int i = 0; i < min; i++) {
a1[i] = Integer.parseInt(s1[i]);
a2[i] = Integer.parseInt(s2[i]);
if (a1[i] > a2[i]) {
return true;
} else if (a1[i] < a2[i]) {
return false;
}
}
// 前面部分都一样的时候,则判断字符串的长度,长度大说明该目录序列是大的
if (s1.length > s2.length) {
return true;
} else {
return false;
}
}
}
方法二:私は、古い学校よりも、彼はただの儀式アイテムのシンプルな感覚を書いたトピックをピットを書き、何のコメントは、私が気を失っていません。
テストカテゴリ:
import java.util.Iterator;
import java.util.TreeSet;
/**
* Created by HU on 2018/5/28.
*/
public class MyTest {
static String SourceStr[]={"1","1.2","4","8","2.2","5","5.2","5.2.1","5.2.1.1.1",
"4.2","4.1","2","3","4.2","4.3","4.4","2.1","2.1.2","1.1"};
static StringBuilder sTemp=new StringBuilder();
public static void main(String[] args) {
TreeSet<Node> ts = new TreeSet<>();
for (int i = 0,n=SourceStr.length; i <n ; i++) {
ts.add(new Node(SourceStr[i], SourceStr[i].split("\\.").length));
}
Iterator<Node> it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next().getName());
}
}
}
クラスの実装:
/**
* Created by HU on 2018/5/28.
*/
public class Node implements Comparable<Node>{
String name;
int length;
public Node() {}
public Node(String name, int length) {
this.name = name;
this.length = length;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int compareTo(Node o) {
if(this.name.equals(o.name))return 0;
if(this.length>o.length){
if(this.name.startsWith(o.name)){
return 1;
}
}else if(this.length<o.length){
if(o.name.startsWith(this.name)){
return -1;
}
}
int index=0;
while(Integer.valueOf(this.name.charAt(index))==Integer.valueOf(o.name.charAt(index))){
index++;
}
return Integer.valueOf(this.name.charAt(index))-Integer.valueOf(o.name.charAt(index));
}
}