Androidアプリ開発のxmlパーサについて知りたい

このQ&Aのポイント
  • Androidアプリ開発でxmlパーサの使い方について教えてください
  • xmlパーサを使って特定の行数だけ読み込む方法を教えてください
  • xmlパーサを使用したAndroidアプリの読込み速度を向上させる方法を教えてください
回答を見る
  • ベストアンサー

androidアプリ開発 xmlパーサについて

お世話になっております。 xmlパーサについておききしたいことがございます。 現在、twitterリーダーアプリを製作中なのですが、 全ての行を読み込むと動作が重いので、 読み込む行の数を10行と指定したいのですが、 いい方法はありますでしょうか。 自分で試してみたところ、 表示させる行の数を指定することには成功したのですが、 いまいち、読込み速度の減少が実感できません。 お力をお貸し頂ければ幸いです。 よろしくお願いします。 // タグの識別子 private static final String PROFILE_IMAGE_URL = "profile_image_url"; public ArrayList<TwitterStatus> parse() { ArrayList<TwitterStatus> list = null; XmlPullParser parser = Xml.newPullParser(); try { byte[] data = HttpClient.getByteArrayFromURL(urlStr); parser.setInput(new StringReader(new String(data, "UTF-8"))); int eventType = parser.getEventType(); TwitterStatus currentStatus = null; boolean isFinished = false; while (eventType != XmlPullParser.END_DOCUMENT && !isFinished) { String name = null; switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<TwitterStatus>(); break; case XmlPullParser.START_TAG: name = parser.getName(); if (name.equalsIgnoreCase(STATUS)) { currentStatus = new TwitterStatus(); } else if (currentStatus != null) { if (name.equalsIgnoreCase(TEXT)) { currentStatus.setText(parser.nextText()); } else if (name.equalsIgnoreCase(SCREEN_NAME)) { currentStatus.setScreenName(parser.nextText()); } else if (name.equalsIgnoreCase(PROFILE_IMAGE_URL)) { // アイコンURLを取得 currentStatus.setProfileImageUrl(parser.nextText()); } } break; case XmlPullParser.END_TAG: name = parser.getName(); if (name.equalsIgnoreCase(STATUS) && currentStatus != null) { list.add(currentStatus); } else if (name.equalsIgnoreCase(STATUSES)) { isFinished = true; } break; } eventType = parser.next(); } } catch (Exception e) { throw new RuntimeException(e); } return list; } }

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#161640
noname#161640
回答No.1

XmlPullParserは、基本的に「全データをロードした後、内容を処理していく」ものですので、表示項目数そのものを減らしても、肝心のダウンロードにかかる時間は変わりませんから短縮化にはならないでしょう。 現状では、RSSやAtomはXML形式で提供されており、XMLは最後まで読み込んでからでないと解析できないので、「途中まで読んで終わらせる」というような使い方は難しいように思えます。もうちょっと別のアプローチを考えないといけませんね。 例えばですが、アクセスして表示したら、その内容をどこかに保管しておき、次に起動したときにはそのキャッシュされている内容をとりあえず表示する。同時に再アクセスし、新しいデータがダウンロード完了した段階で、キャッシュされたデータと比較し、新たな項目だけを追加して表示を更新する。多くのダウンロード型のデータ表示アプリは、だいたいそんな感じでアプローチしていると思います。

Javako
質問者

お礼

good-failure様 いつもご回答ありがとうございます。 根本的に間違った考え方をしていたことに気付きました。 例えばですが、アクセスして表示したら、その内容をどこかに保管しておき、次に起動したときにはそのキャッシュされている内容をとりあえず表示する。同時に再アクセスし、新しいデータがダウンロード完了した段階で、キャッシュされたデータと比較し、新たな項目だけを追加して表示を更新する。多くのダウンロード型のデータ表示アプリは、だいたいそんな感じでアプローチしていると思います。 上記の方法で試してみたいと思います。 ありがとうございました!

関連するQ&A

  • 何故ループがしてくれないんですか?

    口でいうよりもソースコード載せた方が早いので載せます import java.util.Scanner; class StudentsList2 { public static void main(String[] args){ System.out.println("学生番号(23,45,78,51,9)を入力してください>"); Scanner sc=new Scanner(System.in); StList list=new StList(); list.ID=new int[]{23,45,78,51,9}; list.name=new String[]{"荒川","神田","吉田","渡辺","木村"}; int key=Integer.parseInt(sc.next()); list.getName(key); } static class StList{ public String[] name; public int[] ID; void getName(int key){ for(int A=0; A<ID.length; A++){ if(key==ID[0]){ System.out.println(name[0]);break; }else{ if(key==ID[1]){ System.out.println(name[1]);break; }else{ if(key==ID[2]){ System.out.println(name[2]);break; }else{ if(key==ID[3]){ System.out.println(name[3]);break; }else{ if(key==ID[4]){ System.out.println(name[4]);break; } } } } } } } } } 例外処理もなくエラーもかえって来ないんですが一回しか学生名が出力しないです。 何故でしょうか? nameに入っている名前を出力しないといけないですよね。 「ここがおかしいよ」とかのアドバイスをお願いします

    • ベストアンサー
    • Java
  • AndroidアプリのXML送受信

    Androidのアプリとサーバー間でXMLを送受信するという処理を考えています。 http://blog.5ive.info/archives/1040 のsampleを参考にしたのですが、判らない事があります。 ------------------------------------------------------------------------------------------- 【以下、sampleを抜粋】 //[クライアント設定] HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); //[POST送信するデータを格納] List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(1); nameValuePair.add(new BasicNameValuePair("name", "simo")); nameValuePair.add(new BasicNameValuePair("text", "hello!")); //-----[POST送信] httppost.setEntity(new UrlEncodedFormEntity(nameValuePair)); HttpResponse response = httpclient.execute(httppost); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); response.getEntity().writeTo(byteArrayOutputStream); ------------------------------------------------------------------------------------------- 送信する際にList<NameValuePair>というListに格納していますが、NameとValueと2つのパラメータが必要で、XMLのデータのみの送信にNameは必要ありません。 単純にXMLのデータだけを送信したいのですが、httppostでデータを送信するにはList<NameValuePair>を使用するしかないのでしょうか? もし駄目なら、AndroidでXMLを送受信するにはどうしたら良いのでしょうか?

  • ArrayListの中身?

    import java.io.Serializable; public class Master implements Serializable{  private String CODE = null; //番号  private String NAME = null; //名前  public String getCODE() {  return CODE;  }  public void setCODE(String code) {  CODE = code;  }  public String getNAME() {  return NAME;  }  public void setNAME(String name) {  NAME = name;  } } というクラス?があって、 別の場所で List ls = new ArrayList(); Master mst = new Master(); mst.setCODE("00001"); mst.setNAME("テストさん"); ls.add(mst); というふうに、リストにクラスごと追加したとします。 こんなとき、逆に、lsの中身を表示するにはどうしたらいいのでしょう?? ls----Master[0] ----CODE         -----NAME  ----Master[1] ----CODE         -----NAME ・ ・  ----Master[n] ----CODE         -----NAME という風に、格納されているイメージなんですが・・。 どうして、クラスごと、リストに追加したの?っていうのは聞かないでください。 わかる方、教えてください!

    • ベストアンサー
    • Java
  • JSP DB サーブレット 表示

    こにちは。最後のfor分の記述でまよっています。 今回JSPで検索 表示 サーブレットでDB取得(二次元配列で返しています) 昇順、降順、指定行だけ表示、前方一致などの条件をつけて表示しようとしています JSPの最後のFOR文の回数のとこlistサイズなどにしたいのですが リストがないときどうすればいいのかなと・・・ あとは今はとりあえず10と指定しているので前方一致のときに 件数がへるとインデックスが存在しないというエラーがでます どういう風に書けばうまくいくのか少しでいいんでアドバイスください String name=request.getParameter("name"); //NAMEの前方一致条件取得 String narabi=request.getParameter("narabi"); //降順、昇順、の値取得 String menu=request.getParameter("menu"); //昇順、降順するところの列 name取得 db.updateExec("insert into TESTTABLE1(TESTNO,NAME,KANA) values("+1+",'山田', 'ヤマダ')"); db.updateExec("insert into TESTTABLE1(TESTNO,NAME,KANA) values("+2+",'佐藤', 'サトウ')"); ・・・・・・・・・ / /課題のため10行入力 db.commit(); //コミットして 確定 ArrayList list; ArrayList list1; ArrayList list2; //リスト作成 if(narabi!=null){//昇順 降順にチェックがあるか判断 String[][]hai4=db.selectExec("SELECT * FROM TESTTABLE1 WHERE NAME LIKE'"+name+"%' order by "+menu+" "+narabi+" ;"); //nameで前方一致 menuで昇順降順場所 narabiで降順昇順 list = new ArrayList(Arrays.asList(hai4[0])); list1 = new ArrayList(Arrays.asList(hai4[1])); list2 = new ArrayList(Arrays.asList(hai4[2])); }else{//昇順降順なければこっち String[][]hai3=db.selectExec("SELECT * FROM TESTTABLE1 WHERE NAME LIKE'"+name+"%';"); //nameで前方一致 list = new ArrayList(Arrays.asList(hai3[0])); list1 = new ArrayList(Arrays.asList(hai3[1])); list2 = new ArrayList(Arrays.asList(hai3[2])); } if (request.getParameter("TESTNO") != null){ request.setAttribute("list", list); } if (request.getParameter("NAME") != null){ request.setAttribute("list1", list1); } if (request.getParameter("KANA") != null){ request.setAttribute("list2", list2); } //列指定されたときだけ setAttribute db.disconnect();//クローズする RequestDispatcher dispatcher =request.getRequestDispatcher("/::::.jsp"); //フォワード ページ指定 dispatcher.forward(request, response); JSP(検索、表示) <html> <head> <H1>検索画面</H1> </head> <body> <from> <form method="get" action="../Servlet"> 検索内容 TESTNO <input type="checkbox" name="TESTNO" value="TESTNO" > NAME <input type="checkbox" name="NAME" value="NAME" > KANA <input type="checkbox" name="KANA" value="KANA" > <br> 検索条件 <input type="text" name="name" >(NAME前方一致)<br> ソート   <select name="menu"><br> <option value=TESTNO>TESTNO</option> <option value=NAME>NAME</option> <option value=KANA>KANA</option> </select> <input type="radio" name="narabi" value="ASC" /> 昇順 <input type="radio" name="narabi" value="DESC"/> 降順 <br><input type="submit" value="検索"> </from> </body> </form> <Hr> <% if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){ for(int i=0; i<10; i++){ if(request.getAttribute("list")!=null){ List list=(List)request.getAttribute("list"); out.print(list.get(i)+" "); } if(request.getAttribute("list1")!=null){ List list1=(List)request.getAttribute("list1"); out.print(list1.get(i)+" "); } if(request.getAttribute("list2")!=null){ List list2=(List)request.getAttribute("list2"); out.println(list2.get(i)); } 文字数の関係ですこし削っているところもありますが アドバイスよろしくおねがいします

    • ベストアンサー
    • Java
  • JSP DB 表示

    こんにちは。DBから取得 JSPに表示を勉強しています。 条件が 列指定 前方指定 昇順降順などあり 列ごとに取得 表示といった形で表示することができました ただこれだと 横に表示されるのですが、どうすれば縦に表示できるように 組みなおせますか?それかこの組み方だとHTMLでがんばったほうが良いのでしょうか?アドバイスお願いします JSP(検索、表示) <table border> <tr> <td> 検索内容 TESTNO <input type="checkbox" name="TESTNO" value="TESTNO" </td> <td> NAME <input type="checkbox" name="NAME" value="NAME" > </td> <td> KANA <input type="checkbox" name="KANA" value="KANA" > </td> </tr> </table border> <table border> <tr> <td> 検索条件 <input type="text" name="name" >(NAME前方一致) </td> </table> <table border> <tr><td> ソート   <select name="menu"> <option value=TESTNO>TESTNO</option> <option value=NAME>NAME</option> <option value=KANA>KANA</option> </select> <input type="radio" name="narabi" value="ASC" /> 昇順 <input type="radio" name="narabi" value="DESC"/> 降順 </td></tr> </table> <br><input type="submit" value="検索"> </from> </body> </form> <Hr> <% if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){ if(request.getAttribute("list")!=null){ List list=(List)request.getAttribute("list"); for(int i=0; i<list.size(); i++){ out.print(list.get(i)+" "); } } %><br> <% if(request.getAttribute("list1")!=null){ List list1=(List)request.getAttribute("list1"); for(int i=0; i<list1.size(); i++){ out.print(list1.get(i)+" "); } } %><br> <% if(request.getAttribute("list2")!=null){ List list2=(List)request.getAttribute("list2"); for(int i=0; i<list2.size(); i++){ out.print(list2.get(i)+" "); } } %><br> サーブレット(取得、フォワードで転送) String name=request.getParameter("name"); //NAMEの前方一致条件取得 String narabi=request.getParameter("narabi"); //降順、昇順、の値取得 String menu=request.getParameter("menu"); //昇順、降順するところの列 name取得 db.updateExec("insert into TESTTABLE1(TESTNO,NAME,KANA) values("+1+",'山田', 'ヤマダ')"); db.updateExec("insert into TESTTABLE1(TESTNO,NAME,KANA) values("+2+",'佐藤', 'サトウ')"); ・・・・・・ //課題のため10行入力 db.commit(); //コミットして 確定 ArrayList list; ArrayList list1; ArrayList list2; //リスト作成 if(narabi!=null){//昇順 降順にチェックがあるか判断 String[][]hai4=db.selectExec("SELECT * FROM TESTTABLE1 WHERE NAME LIKE'"+name+"%' order by "+menu+" "+narabi+" ;"); //nameで前方一致 menuで昇順降順場所 narabiで降順昇順 list = new ArrayList(Arrays.asList(hai4[0])); list1 = new ArrayList(Arrays.asList(hai4[1])); list2 = new ArrayList(Arrays.asList(hai4[2])); }else{//昇順降順なければこっち String[][]hai3=db.selectExec("SELECT * FROM TESTTABLE1 WHERE NAME LIKE'"+name+"%';"); //nameで前方一致 list = new ArrayList(Arrays.asList(hai3[0])); list1 = new ArrayList(Arrays.asList(hai3[1])); list2 = new ArrayList(Arrays.asList(hai3[2])); } if (request.getParameter("TESTNO") != null){ request.setAttribute("list", list); } if (request.getParameter("NAME") != null){ request.setAttribute("list1", list1); } if (request.getParameter("KANA") != null){ request.setAttribute("list2", list2); } 結果 1 2 3 4 5 6 7 8 9 10 山田 佐藤 山本 伊藤 武田 鈴木 小野 松井 田中 高橋 ヤマダ サトウ ヤマモト イトウ タケダ スズキ オノ マツイ タナカ タカハシ 1 山田 ヤマダ 2 佐藤 サトウ ・・・・・・ といった表示にしたいです 行ごとに取得して繰り返すのがいいのかなと思って最初やていたのですが 列指定したときに エラー(指定listがない)といったようになるので この組み方にしました。 アドバイスお願いします

    • ベストアンサー
    • Java
  • FlashとXMLとの連動

    初心者ですがよろしくお願いします。 FlashとXMLとを連動させたフォトギャラリーを作成していますが うまく読み込みできずnullになります。 Flash内の機能としては、 ・自動スライド機能 ・画像をクリックするとXML内のURLへジャンプ を入れたいと思ってます。 下記内容を御覧頂きご指摘お願いします。 XML内 <Slides>  <slide>  <jpegURL>images/image1.jpg</jpegURL>   <product_name>名前</product_name>   <product_url>URL</product_url>  </slide>  <slide>  <jpegURL>images/image2.jpg</jpegURL>   <product_name>名前2</product_name>   <product_url>URL2</product_url>  </slide> </Slides> Flash内ActipnScript slides_xml = new XML(); slides_xml.onLoad = startSlideShow; slides_xml.load("slides.xml"); slides_xml.ignoreWhite = true; //自動スライドを定義 function nextSlideload(){ nextSlideNode = currentSlideNode.nextSibling; if (nextSlideNode == null) { break; } else { currentIndex++; updateSlide(nextSlideNode); currentSlideNode = nextSlideNode; } } // Show the first slide and intialize variables function startSlideShow(success) { if (success == true) { rootNode = slides_xml.firstChild; totalSlides = rootNode.childNodes.length; firstSlideNode = rootNode.firstChild; currentSlideNode = firstSlideNode; currentIndex = 1; updateSlide(firstSlideNode); setInterval(nextSlideload,3500) } } function nextSlideload(){ nextSlideNode = currentSlideNode.nextSibling; if (nextSlideNode == null) { break; } else { currentIndex++; updateSlide(nextSlideNode); currentSlideNode = nextSlideNode; } }; // Updates the current slide with new image and text function updateSlide(newSlideNode) { imagePath = newSlideNode.attributes.jpegURL; slideText = newSlideNode.firstChild.nodeValue; loadMovie(imagePath, targetClip); } // Event handler for 'Next slide' button next_btn.onRelease = function() { nextSlideNode = currentSlideNode.nextSibling; if (nextSlideNode == null) { break; } else { currentIndex++; updateSlide(nextSlideNode); currentSlideNode = nextSlideNode; } }; // Event handler for 'Previous slide' button back_btn.onRelease = function() { previousSlideNode = currentSlideNode.previousSibling; if (previousSlideNode == null) { break; } else { currentIndex--; currentSlideNode = previousSlideNode; updateSlide(previousSlideNode); } };

  • while文の表示

    こんにちは 今DB接続し DBからデータを表示するのを勉強しています public String[][] selectExec(String sql) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //KAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 while(aa.next()){ //Resultsetが最終行になるまで実行 TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); public String[][] selectExec(String sql, int fromIdx,int toIdx) throws SQLException{ String[][]all=selectExec(sql); ArrayList list = new ArrayList(Arrays.asList(all[0])); ArrayList list1 = new ArrayList(Arrays.asList(all[1])); ArrayList list2 = new ArrayList(Arrays.asList(all[2])); int i=1; while(i<fromIdx){ //指定された前のリスト削除 list.remove(0); list1.remove(0); list2.remove(0); i++; } while(toIdx<list .size()){ //指定されたあとのリスト削除 list .remove(toIdx); list1.remove(toIdx); list2.remove(toIdx); toIdx++; } return hairetu(list ,list1,list2); public String[][] hairetu(ArrayList T,List N ,List K){ String[][]all=new String[3][T.size()]; all[0] = (String[])T.toArray(new String[0]);//配列TSETNOに収納 all[1] = (String[])N.toArray(new String[0]);//配列NAMEに収納 all[2] = (String[])K.toArray(new String[0]);//配列KANAに収納 return all; selectExec(String sql)で全表示 selectExec(String sql, int fromIdx,int toIdx) で列を何行~何行を指定 でリストに変換、リスト削除して 二次元配列にもどしているのですが たとえば 1~5を指定すると 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 6 6 6 8 8 8 ↑のように 5ひとつとばしで表示されます while文の書き方がわるいのでしょうか・・・・ アドバイスお願いします

    • ベストアンサー
    • Java
  • Xercesを使ったjavaでのXML解析

    DOMを使ってXML文書を解析するJavaのソースコードで、DOMパーサは、クラス org.apache.xerces.parsers.DOMParserで参照している下記のプログラムで、 [Fatal Error] :17:109: The entity name must immediately follow the '&' in the entity reference. org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 109; The entity name must immediately follow the '&' in the entity reference. のエラーが出てしまって、解決策が分かりかねています。Javaのネットワークプログラミングに詳しい方、御教示願えればと思います。 package nikkei; import java.io.ByteArrayInputStream; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class TwitterSearch { public static void main(String[] args) throws Exception { TwitterSearch search = new TwitterSearch(); search.search("日経ソフトウエア"); } public void search(String keyword) throws Exception { SearchAPIClient client = new SearchAPIClient(); String xml = client.execute(keyword); parse(xml); } private void parse(String xml) throws Exception { DOMParser parser = new DOMParser(); try { parser.parse(new InputSource(new ByteArrayInputStream(xml.getBytes()))); Document doc = parser.getDocument(); NodeList entries = doc.getElementsByTagName("entry"); for (int i = 0; i < entries.getLength(); i++) { String name = null; String tweet = null; Element entry = (Element) entries.item(i); NodeList titleList = entry.getElementsByTagName("title"); if (titleList.getLength() == 1) { tweet = titleList.item(0).getTextContent(); } NodeList authorList = entry.getElementsByTagName("author"); if (authorList.getLength() == 1) { Element author = (Element) authorList.item(0); NodeList nameList = author.getElementsByTagName("name"); if (nameList.getLength() == 1) { name = nameList.item(0).getTextContent(); } } System.out.println(name + "さんのツイート"); System.out.println("\t" + tweet); } } catch (Exception e) { e.printStackTrace(); } } } package nikkei; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; public class SearchAPIClient { public String execute(String keyword) throws Exception { String url = "https://twitter.com/search?q=" + keyword; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); if (entity != null) { return EntityUtils.toString(entity); } else { return null; } } } よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ListからMapを作成 MapのValueにはListをput

    すみません、どなたか教えて下さい。 あるListからMapを作成したく、同じkeyが存在する場合、valueのListへ値を追加したいですのですがConcurrentModificationExceptionエラーが返されてしまいます。エラーを返さないように変数を使い分け工夫したつもりですが。。。((1)でmapAにもaddされている!?)他に良い方法はないでしょうか? Map mapA = new TreeMap(); Map mapB = new TreeMap(); Iterator it = listA.iterator(); while (it.hasNext()) { Bean bean = (Bean)it.next(); List mapvaluelist = new ArrayList(); if (mapA.size()==0){ mapvaluelist.add(bean); mapA.put(bean.getName(),mapvaluelist); }else{ if (mapB.size()!=0){ mapA = mapB; } Set keyset = mapA.keySet(); Iterator itmap = keyset.iterator(); while (itmap.hasNext()){ String mapkey = (String)itmap.next(); if (bean.getName().equals(mapkey)){ mapvaluelist = (List)mapA.get(mapkey); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); (1) }else{ mapvaluelist.clear(); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); } } } }

  • 簡単な配列の作り方

    やりたいことがあるのですが、原始的なやり方しか思いつきません。 簡単な方法があればご教授願いたく思い質問いたしました。 よろしくお願いします! <やりたいこと> 明細行が5件ありまして、それぞれの行に有効かどうかフラグがある。 5件のうち有効になっている数だけの配列を作成する。 --------------------------------------------- 例1)1,2,3,4,5のうち2,3,5の3行が有効の場合   String[] str = String[]{2,3,5} 例2)1,2,3,4,5のうち4の1行が有効の場合   String[] str = String[]{4} --------------------------------------------- <現在やっていること> // 有効行の判断用 private boolean yukoFlg1 = false; private boolean yukoFlg2 = false; private boolean yukoFlg3 = false; private boolean yukoFlg4 = false; private boolean yukoFlg5 = false; // 有効行の数 private long yukoCnt = 0; /** * 該当行分の配列にする String[] * @param str 配列にしたい値 */ public String[] setStrArray ( String str1, String str2, String str3, String str4, String str5) throws Exception { String[] result = null; // 有効行の数が1の場合 if (yukoCnt == 1) { if (yukoFlg1) { result = new String[]{str1}; } else if (yukoFlg2) { result = new String[]{str2}; } else if (yukoFlg3) { result = new String[]{str3}; } else if (yukoFlg4) { result = new String[]{str4}; } else { result = new String[]{str5}; } // 有効行の数が2の場合 } else if (yukoCnt == 2) { if (yukoFlg1) { if (yukoFlg2) { result = new String[]{str1, str2}; } else if (yukoFlg3) { result = new String[]{str1, str3}; } else if (yukoFlg4) { result = new String[]{str1, str4}; } else { result = new String[]{str1, str5}; } } else if(yukoFlg2) { if (yukoFlg3) { result = new String[]{str2, str3}; } else if (yukoFlg4) { result = new String[]{str2, str4}; } else { result = new String[]{str2, str5}; } } else if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str3, str4}; } else { result = new String[]{str3, str5}; } } else { result = new String[]{str4, str5}; } // 有効行の数が3の場合 } else if (yukoCnt == 3){ if (yukoFlg1) { if (yukoFlg2) { if (yukoFlg3) { result = new String[]{str1, str2, str3}; } else if (yukoFlg4) { result = new String[]{str1, str2, str4}; } else { result = new String[]{str1, str2, str5}; } } else if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str1, str3, str4}; } else { result = new String[]{str1, str3, str5}; } } else { result = new String[]{str1, str4, str5}; } } else if (yukoFlg2) { if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str2, str3, str4}; } else { result = new String[]{str2, str3, str5}; } } } else { result = new String[]{str3, str4, str5}; } // 有効行の数が4の場合 } else if (yukoCnt == 4) { if (!yukoFlg1) { result = new String[]{str2, str3, str4, str5}; } else if (!yukoFlg2) { result = new String[]{str1, str3, str4, str5}; } else if (!yukoFlg3) { result = new String[]{str1, str2, str4, str5}; } else if (!yukoFlg4) { result = new String[]{str1, str2, str3, str5}; } else { result = new String[]{str1, str2, str3, str4}; } // 有効行の数が5の場合 } else { result = new String[]{str1, str2, str3, str4, str5}; } return result; }

    • ベストアンサー
    • Java

専門家に質問してみよう