配列内で繰り返される要素の解析、検索(Java)



配列に繰り返される要素を解析し、検索し、Javaを実装します.
「データ構造とアルゴリズム分析:配列に重複する要素を解析、検索」
質問の説明:構造化されたデータで、昇順などの順序で並べられた配列の中で、秩序配列dataのような同じ要素が何回も繰り返し現れると仮定します.
data = {  "A", "A", "B", "C", "C", "D", "D", "D"  }
data配列では、A->Z昇順に並べられていたが、配列内部のデータ要素が不規則に繰り返される:'A'は配列位置0,1(注:0,1は下付き、以下同)で2回繰り返される.'B’は重複していない;C’は配列位置3,4で2回繰り返し現れる;D’は5,6,7の位置で3回繰り返される.
このようなデータ構造に対して、アルゴリズムを設計し、配列に繰り返される要素の検索、分析をコードする.
アルゴリズムの応用シーン:このアルゴリズムの応用シーンの一つは、通信録の連絡先の操作に関与することである.例えば私が前に書いた文章:『AndroidはPinnedSectionListViewに基づいて連絡先通信録を実現する』(リンクアドレス:http://blog.csdn.net/zhangphil/article/details/47271741この文書は、連絡先の姓の先頭文字に従ってグループ化する必要がある通信録の分類整理に関連しています).通常、1つの携帯電話の連絡先には複数の連絡先が存在し、各連絡先には姓があり、姓の頭文字(例えば、中国語姓「張」、Zhang、頭文字「Z」)に従って昇順に並べば、上記data配列のようなデータ構造を構成し、さらに連絡先をグループ化する.例えば、いずれも張姓連絡先であれば、「Z」グループに分類され、ユーザーが通信録のいずれかの姓連絡先を迅速に検索するのに便利である.したがって,この現実における応用シーンをデータモデルとして構築することは,本アルゴリズムが解決すべき計算問題である.コード実装(Java)のアルゴリズムを示します.
import java.util.ArrayList;

public class Test {

	//     data。  data                  。
	//   ,             。
	//         、  data           。
	//   ,   data   ,  'C'     2,3      。
	//   !          ,    'B'。
	private String[] data = { "A", "A", "B", "C", "C", "D", "D", "D" };

	//           。
	private ArrayList groups = new ArrayList();

	//        。
	public void find() {

		//   index
		int index = 0, j = 0;

		while (index < data.length) {
			Group group = new Group();
			group.title = data[index];
			
			String t = group.title;

			ArrayList children = new ArrayList();

			for (j = index; j < data.length; j++) {

				String child = data[j];
				if (t.equals(child)) {
					//                     j,    、    。
					children.add(child + "@" + j);
				} else {
					break;
				}
			}

			//       index
			index = j;

			group.children = children;
			groups.add(group);
		}
	}

	//     。
	private void print() {
		for (int i = 0; i < groups.size(); i++) {
			Group g = groups.get(i);
			System.out.println(g);
		}
	}

	//        ,         。
	//      title    group              。
	//  title         ArrayList children ,     。
	private class Group {
		public String title;
		public ArrayList children;

		//   。
		@Override
		public String toString() {
			String str = " " + title + ": ";
			for (int i = 0; i < children.size(); i++) {
				str += children.get(i) + " ";
			}

			return str;
		}
	}

	public static void main(String args[]) {
		Test t = new Test();
		t.find();
		t.print();
	}
}

結果出力:
 A: A@0 A@1 
 B: B@2 
 C: C@3 C@4 
 D: D@5 D@6 D@7