-1

たとえば、これらのような文字列があります

309\306\308\337_338

309\306\337_338

310

311\315_316\336_337

311\315_316\336_337

311\335_336

これらの文字列はページ番号のリストを意味します。たとえば、文字列 "309\306\308\337_339" はページ 309,306,308,337,338,339 を意味します

これらの文字列の 1 つを関数に渡し、この 309,306,308,337,338,339 のような文字列として返したい

この関数はそれを行いますが、C#では、Androidで突き刺したいです

 private static string Get_PageNumbers(string str)
    {
        ArrayList arrAll = new ArrayList();
        MatchCollection match;
        string[] excar;
        string strid, firstNumber, lastlNumber;
        int fn, ln;
        ArrayList arrID = new ArrayList();

        //***In Case The Range Number Between "_"
        if (str.Contains("_"))
        {
            // match_reg = new Regex("(w?[\\d]+)*(_[\\d]+)");
            Regex matchReg = new Regex("(w?[\\69]+_[\\d]+)*(q?[\\d]+//)*(a?[\\d]+_[\\d]+)*(y?[\\d]+)*");
            match = matchReg.Matches(str);

            int count = match.Count;
            excar = new string[0];
            for (int i = 0; i < count; i++)
            {
                Array.Resize(ref excar, count);

                excar[i] = match[i].Groups[0].Value;
                if (excar[i] != string.Empty)
                    arrID.Add(excar[i]);
            }

            //******IF Array Contains Range Of Number Like"102_110"
            if (str.Contains("_"))
            {
                for (int i = 0; i < arrID.Count; i++)
                {
                    strid = arrID[i].ToString();

                    if (arrID[i].ToString().Contains("_"))
                    {
                        int idy = strid.LastIndexOf("_");
                        firstNumber = strid.Substring(0, idy);

                        if (idy != -1)
                        {
                            lastlNumber = strid.Substring(idy + 1);
                            fn = int.Parse(firstNumber);
                            arrAll.Add(fn);
                            ln = int.Parse(lastlNumber);
                            for (int c = fn; c < ln; c++)
                            {

                                fn++;
                                arrAll.Add(fn);

                            }
                        }
                    }
                    else
                    {
                        arrAll.Add(arrID[i].ToString());
                    }
                }

                //******If Array Contain More Than One Number
                if (arrAll.Count > 0)
                {
                    str = "";
                    for (int i = 0; i < arrAll.Count; i++)
                    {

                        if (str != string.Empty)
                            str = str + "," + arrAll[i];
                        else
                            str = arrAll[i].ToString();
                    }

                }
            }
        }

        //***If string Contains between "/" only without "_"

        else if (str.Contains("/") && !str.Contains("_"))
        {
            str = str.Replace("/", ",");
        }
        else if (str.Contains("\\"))
        {
            str = str.Replace("\\", ",");
        }
        return str;
    }
4

2 に答える 2

1

これは関数で行う方が簡単だと思いsplitます:

public static String Get_PageNumbers(String str) {// Assume str = "309\\306\\308\\337_338"
    String result = "";
    String[] pages = str.split("\\\\"); // now we have pages = {"309","306","308","337_338"}
    for (int i = 0; i < pages.length; i++) {
        String page = pages[i];
        int index = page.indexOf('_');
        if (index != -1) { // special case i.e. "337_338", index = 3
            int start = Integer.parseInt(page.substring(0, index)); // start = 337
            int end = Integer.parseInt(page.substring(index + 1)); // end = 338
            for (int j = start; j <= end; j++) {
                result += String.valueOf(j);
                if (j != end) { // don't add ',' after last one
                    result += ",";
                }
            }
        } else { // regular case i.e. "309","306","308"
            result += page;
        }
        if (i != (pages.length-1)) { // don't add ',' after last one
         result += ",";
        }
    }
    return result; // result = "309,306,308,337,338"
}

たとえば、この関数は次のように呼び出されます。

String result1 = Get_PageNumbers("309\\306\\308\\337_338");
String result2 = Get_PageNumbers("311\\315_316\\336_337");
String result3 = Get_PageNumbers("310");

戻り値:

309,306,308,337,338
311,315,316,336,337
310
于 2012-08-02T15:17:47.160 に答える
0

別の実装を提案できれば....

  1. 最初に、「\」str.split("\\");で文字列を分割します。ここでは、単一の数値または「num_num」のようなパターンの配列文字列を受け取ります
  2. 作成されたすべての文字列について、文字列に " " 文字が含まれていない場合は、文字列を別の配列 (名前付きの othArr) に入れます。それよりも、" "str.split("_");で再度分割すると、2 位置の配列ができます。
  3. その2つの文字列を整数に変換します
  4. ここで、最大値または変換された 2 つの文字列から最小値への戦利品を作成します (そしてそれを othArr に入れます)
  5. 「,」で区切られた文字列で othArr を変換します
于 2012-08-02T15:26:12.363 に答える