• ベストアンサー

文字列の分割

"abcdefghijk"というような文字列を  例(1):abcd、efg、h、i、jk  例(2):ab、cdefg、h、ijk  例(3):a、b、c、de、f、ghijk のように分割したいのですが、substringを使って取得するしかないでしょうか。 素人考えですみませんが、 class test{ char[] a = new char[4]; char[] b = new char[3]; char c; char d; char[] e = new char[2]; } のようなクラスを作り、 test t = new test(); t = "abcdefghijk"; などどすることで、分割する方法はないでしょうか。  #上記を試したところ、互換性のない型とエラーになりました。 分割するパターンが複数あり、文字列が長くなるとsubstringを記述する回数が増え、 終了インデックスを間違えそうで。  #間違えないようにすればいいだけの話ですが。 substring以外の方法、またはsubstringの上手な使い方がありましたら、教えていただけないでしょうか。 よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.3

こんなのとか public class Main { public static void main(String[] args) { int[] points = { 4, 7, 8, 9 }; Test test = new Test("abcdefghijk", points); System.out.println(test); } } public class Test { private ArrayList<String> strs = new ArrayList<String>(); public Test(String str, int[] points) { int count = 0; StringBuffer sb = new StringBuffer(); for( int i = 0; i < str.length(); i++ ) { char c = str.charAt(i); if( count < points.length && i == points[count] ) { strs.add(sb.toString()); sb = new StringBuffer(); count++; } sb.append(c); } strs.add(sb.toString()); } public String toString() { StringBuffer sb = new StringBuffer(); for( String str : strs ) { sb.append(str).append(","); } return sb.deleteCharAt(sb.length() - 1).toString(); } }

north357
質問者

お礼

サンプルの提示ありがとうございます。 参考にさせて頂きます。 回答ありがとうございました。

その他の回答 (2)

  • mahojula
  • ベストアンサー率32% (21/65)
回答No.2

活用できるか わからないですが  文字数の分岐は 固定値として持たれている場合に    (なので あんまり 再利用には向いてないかもです) import java.util.ArrayList; public class Main { int[] moji = new int[]{4, 3, 1, 1, 2}; //文字の切り分け方 ArrayList al = new ArrayList(); public static void main(String[] args) { Main t = new Main(); } public Main() { try { String inStr = "abcdefghijk"; //分割する文字列 check(inStr); //文字数チェック setStr(inStr); //ArrayList に 分割文字格納 alPrint(al); //とりあへず出力 } catch (Exception e) { e.printStackTrace(); } } void setStr(String str) { int count = 0; for (int i = 0; i < moji.length; i++) { al.add(str.substring(count, count += moji[i])); } } void alPrint(ArrayList al) { for (int i = 0; i < al.size(); i++) { System.out.println(al.get(i)); } } void check(String inStr) throws Exception { int len = 0; for (int i = 0; i < moji.length; i++) { len += moji[i]; } if (len != inStr.length()) { throw new Exception("文字数不一致"); } } }  可視性とかそっち系統は 一切考慮してません。

north357
質問者

お礼

文字数の分岐は、ほぼ固定値なので 参考にさせて頂き自分でも考えてみたいと思います。 回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「指定した大きさで分割するメソッド」を作ればいいのでは? 例えば void split(String aString, char [][] result, int [] sizes) とかいうメソッドを作ってやる.

north357
質問者

お礼

やはり自分でメソッドを作成しないといけないのですね。 他の方の回答も参考にして作成してみたいと思います。 回答ありがとうございます。

関連するQ&A

  • Excel VBA 文字列分割の方法で

    EXCEL および WORD のVBAです。 2003 および 2010でやっています。 たとえば文字列で以下のようなものがあったとき、 12,6,"abcde","(3,4)","efg""h""ijk",3 このとき、文字列をカンマ(,)で分割して   12   6   "abcde"   "(3,4)"   "efg""h""ijk"   (あるいは efg"h"ijk)   3 のようにして抽出したいのですが、どのような方法があるでしょうか。 たとえば、      mid(文字列,i,1) のようにiの値を文字列の長さ分ループさせて、1文字ずつ自力で 文字列の範囲や""などを解釈して分割するしかないのでしょうか。 それともスマートな方法があるのでしょうか。 どなたか、よろしくご教授ください。

  • 文字列を分割するクラスについて

    住所のメソッドでの開発についてご質問がございます。 仕様 住所の配列は全角80(半角160)に格納される。 住所地名の途中で分割しないようにする。 80桁すべてに文字は格納されているときは20桁の4等分にする。 スペースで分割をおこなうようにする。 例1  実行前  札幌市 ○区 北○○○○○ 00-0-0-00      実行後  札幌市 ○区 北○○○○○,00-0-0-00,,      例1の場合20桁ずつ分割を考えると14桁目のスペースを利用してカンマ区切りで4つに分割 例2 実行後  あああああ いいいいい ううううう ええ     実行後  あああああ いいいいい ううううう ええ,,,     例2の場合文字がちょうど20桁なのでちょうどカンマ区切りで4等分  例3  実行前   あああああ いいいい ううううううううううう えええええ 0-00-000       実行後   あああああ いいいい,ううううううううううう えええええ,0-00-000,      例3の場合20文字だと区切りだと、うの領域の途中になるため      11桁目のスペースを利用して分割      そしてそこから20桁目を区切ろうとして次の区切りたい場所が      番地の途中になるため実行後のように、えで区切り4等分にカンマ区切り と基本的に住所分割をスペースを利用して住所の途中や番地の途中で 区切らないでカンマ区切りの4等分にするアルゴリズムを考えています。 private void 住所漢字(String 住所漢字, String 住所カナ, String 住民票住所漢字,PrintWriter out) { //(1)分割する文字列を生成 String str = new String(住所漢字); //(2)文字列をsplitメソッドで分割 String[] strAry = str.split(",", 0); { str = 住所漢字; } for (int i=0; i<strAry.length; i++) { } out.print(str.substring(0,20)+","+ str.substring(20,40) +","+ str.substring(40,60)+","+ str.substring(60,80)); }      現在は単純に全角80桁の配列に対して 20桁ずつの4等分に実行されるだけのプログラムになってます。 上記の例のような住所分割のアルゴリズムを開発する際 StringTokenizer st = new StringTokenizerのクラスは開発に有効でしょうか? また有効である場合のソース実行例の等のアドバイス、もしくは ほかに文字を分割するための便利なクラスがございましたら ご教授ください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 全角空白での文字列分割について

    教えてください。 以下のような文字列で、全角空白をキーに2つに分割したいと考えています。 テストテキスト テストテストテスト スクリプトの文字コードはshiftJISで、分割対象の文字列もshiftJISです。 use encoding "shiftjis";  としてます。 ($t1,$t2) = split(/ /, $t); として試してみましたが、やはり無理でした。 何か良い方法がありましたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字だけ残して数字だけ消す

    Excel2003 VBAで文字だけを残して数字だけを消す方法を色々と考えたのですが 上手くマクロが作れずにおります。 例として、 A列    B列  C列 7月1日  東京  ABCDEF123456GHIJK のような、C列の部分のみ、文字と文字の間にある数字の部分だけを消したいのです。 理想的な結果としては 7月1日 東京 ABCDEFGHIJK という状態にしたいのですが可能でしょうか? ctrl+Gでは、全部消えてしまって困っています。 以上、宜しくお願いします。

  • 文字列を1文字づつ分割する方法

    たとえば、 String str = "あいうえお"; とある場合、"あ"、"い"、"う"、"え"、"お"などと1文字づつ分割して、 char[] a = new char[5]; a[0] = "あ"; a[1] = "い"; a[2] = "う"; a[3] = "え"; a[4] = "お"; といったように配列に代入することは出来るのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字列扱い方

    構造体の中の配列へ文字列を入れる方法がわからなくてこまっています! #include <stdio.h> struct TEST{     char str[32]; }; int main(){     TEST test;     test.str = "test";     return 0; } このように入力するとconst char [5]' から 'char [32]' に変換できません。と出てしまいます。 何か良い方法がありましたらぜひご教授お願いいたします。

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • substringで文字を分割

    全角80桁の文字列を全角空白を利用して4分割したいのですが 下記にご質問内容を記載します。 String str = new String(住所漢字); Matcher j = pattern2.matcher(住所漢字); Pattern pattern2 = Pattern.compile("^.{1,20} ");で 文字列の先頭から始まって半角空白で終わる最大21文字 (最後の全角空白を含む)にマッチさせた文字列に Matcher j = pattern2.matcher(住所漢字); while(j.find()) { 正規表現で抜き出した文字列の文字カウントをチェック int mojiLength = i.group().length(); String iNewString = tmp.substring(mojiLength); out.print(j.group()+","+iNewString); として、正規表現でマッチさせた文字列以降を substringで抜き出したのですが それ以降の文字列も同じようにして substringで抜き出した20文字以降の文字列に 先に設定した正規表現を利用して分割して カンマ区切の4分割にしたいのですが この先の方法が分からず色々調べている最中です。 すいませんがぜひアドバイスお願いします。

    • ベストアンサー
    • Java
  • PythonでDLLからの戻り値で文字列の場合を正しく表示させたい

    VisualStudio2005でDLLを作成して、Python2.6のctypesモジュールを使って、PythonからC++のルーチンを呼び出す際に、文字列を引数として、文字列を戻り値として使えるようにC++を記述したいのですがどうすればよいのでしょうか? 関数呼び出しは __stdcallです。 __declspec(dllexport) unsigned char* __stdcall Test(const char *s, int n); とした場合、Pythonで戻り値を見るとint型の数値でした。 from ctypes import * lib = windll.LoadLibrary("test.dll") s = lib.Test("abcdefghijk", 3) print s

  • 文字列のswap

    文字列をswapするプログラムを作りたいと思っています。 やってみると、最初の一文字しかswapされません。 どうしてこれではいけないのでしょうか? よろしくお願いします。 以下が作ったプログラムです。 #include<stdio.h> void swap(char *a,char *b); int main() { char a[2][5]={"abc","efg"}; printf("befor a[0]:%s a[1]:%s?n",a[0],a[1]); swap(&a[0],&a[1]); printf("after a[0]:%s a[1]:%s?n",a[0],a[1]); } void swap(char *a,char *b) { char *tmp; tmp=*a; *a=*b; *b=tmp; } 実行結果は befor a[0]:abc a[1]:efg after a[0]:ebc a[1]:afg となります。 befor a[0]:abc a[1]:efg after a[0]:efg a[1]:abc となって欲しいです。

専門家に質問してみよう