- ベストアンサー
文字列の分割
"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の上手な使い方がありましたら、教えていただけないでしょうか。 よろしくお願いします。
- north357
- お礼率100% (3/3)
- Java
- 回答数3
- ありがとう数4
- みんなの回答 (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(); } }
その他の回答 (2)
- mahojula
- ベストアンサー率32% (21/65)
活用できるか わからないですが 文字数の分岐は 固定値として持たれている場合に (なので あんまり 再利用には向いてないかもです) 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("文字数不一致"); } } } 可視性とかそっち系統は 一切考慮してません。
お礼
文字数の分岐は、ほぼ固定値なので 参考にさせて頂き自分でも考えてみたいと思います。 回答ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「指定した大きさで分割するメソッド」を作ればいいのでは? 例えば void split(String aString, char [][] result, int [] sizes) とかいうメソッドを作ってやる.
お礼
やはり自分でメソッドを作成しないといけないのですね。 他の方の回答も参考にして作成してみたいと思います。 回答ありがとうございます。
関連する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文字ずつ自力で 文字列の範囲や""などを解釈して分割するしかないのでしょうか。 それともスマートな方法があるのでしょうか。 どなたか、よろしくご教授ください。
- ベストアンサー
- Excel(エクセル)
- 文字列を分割するクラスについて
住所のメソッドでの開発についてご質問がございます。 仕様 住所の配列は全角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では、全部消えてしまって困っています。 以上、宜しくお願いします。
- ベストアンサー
- Visual Basic
- 文字列を1文字づつ分割する方法
たとえば、 String str = "あいうえお"; とある場合、"あ"、"い"、"う"、"え"、"お"などと1文字づつ分割して、 char[] a = new char[5]; a[0] = "あ"; a[1] = "い"; a[2] = "う"; a[3] = "え"; a[4] = "お"; といったように配列に代入することは出来るのでしょうか? よろしくお願いします。
- ベストアンサー
- Java
- 文字列の検索
先日同じ質問をして、プログラムの内容を修正したのですが、今度は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と出力
- ベストアンサー
- C・C++・C#
- 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 となって欲しいです。
- 締切済み
- C・C++・C#
お礼
サンプルの提示ありがとうございます。 参考にさせて頂きます。 回答ありがとうございました。