endIndexはどこを指す?

このQ&Aのポイント
  • c#初心者がendIndexの指す範囲について質問しています。
  • 要約文1と要約文3は、startIndexとlengthに関する問題を、要約文2はその他の問題について説明しています。
  • 質問者は、startIndexとlengthを使ってendIndexを求める方法について悩んでいます。両方の方法には問題がありますが、他の方法を思いつかないため、意見を求めています。
回答を見る
  • ベストアンサー

endIndexはどこを指す?

 こんにちは。c#初心者です(今回c#関係ないです)。  あるクラスを作っているのですが、それが配列に対する情報を記録していて、大雑把に int startIndex; int length;  をフィールド変数に持っています。これらのゲッター、セッターも用意するのですが、 都合上、「endIndex」もある方が便利なこともあるので、「GetEndIndexメソッド([c#]EndIndex)」を実装しようと思うのですが、問題が発生しました。  最初は普通に、 int GetEndIndex() { return startIndex + length; }  のようにしていました。  つまり、12~24(境界を含む)を表す場合、「length」が13になるので、「StartIndex」が12、「EndIndex」が25を表すことになります。  これだと開始位置は範囲に含まれているのに、終了位置は範囲に含まれていないことになりかなり分かりにくいです。  じゃあ、1引けばいいじゃないかと、 int GetEndIndex() { return startIndex + length - 1; }  こうすると、さっきの場合「StartIndex」が12、「EndIndex」が24になり、この問題は解消されました。が、そのために別の問題が発生しました。  lengthが0のときです。例えば「15~で、長さが0」と設定された場合、「startIndex」は15で、「EndIndex」は14になってしまいます。  これを見たら混乱する人がかなり出てくるんじゃないかと思います。  結局、どちらの方法を取っても何らかの問題は残ってしまい、すっきりしません。  何か他にいい方法があればよいのですが、思いつきません。  どちらかの方法をとるか、別の方法をとるのか。皆さんのご意見をお聞かせください。

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

  • ベストアンサー
  • cma3atgoo
  • ベストアンサー率35% (32/90)
回答No.2

自分が実装するとすれば 2番目のやり方そのままか、 length=0のときは-1とか何か異常値を返すなりすると思います 使い方(使わせ方?)で変わると思います

koumei000
質問者

お礼

 回答ありがとうございます。  「使い方」ですか。確かにそうです。本来の目的を忘れるところでした。クラスは利用者が使いやすいように実装すべきですから、利用する立場からもう少し考えてみます。

その他の回答 (4)

回答No.5

ならば、 return startIndex + length; にして、endIndexは範囲に含まれないことに気を付ける(複数の人が使うなら、各所にコメントしておくなどして、周知徹底する)以外ないんじゃないの?

koumei000
質問者

お礼

 再びの回答ありがとうございます。  う~ん、良く考えてみたのですが、「LastIndex」なら範囲の最後の位置を指すのがよいかと思ったのですが、「"End"Index」なので、範囲が”終了する”(=すでに範囲が終わっている)位置としてもいいんじゃないかと。  使い方の観点からしても、わざわざ1引く必要もなさそうです。  協力ありがとうございました。

回答No.4

length==0 を特別扱いしなくていい案1に一票。

koumei000
質問者

お礼

 回答ありがとうございます。  やっぱり、そうなりますか。あとは<summary>の書き方に注意しないといけないですね。

回答No.3

return startIndex+((length==0)?0:length-1); にしたらどうですか?

koumei000
質問者

お礼

 回答ありがとうございます。  えーっと、その方法だと、16~16(length = 1)と、16~(length = 0)(どちらも境界を含む)の場合、どちらの「EndIndex」も16になってしまって、問題があるかと思います。  しかしながら、貴重な意見、ありがとうございます。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

自分は最初の実装でOKではないかと思います。 というのも、for文を書く場合に for (int i = a.getStartIndex(); i < a.getEndIndex(); i++){ /* ほにゃらら */ } となり、普通のN回ループをまわす場合の for (int i = 0; i < N; i++){ /* ほにゃらら */ } と不等号が同じになります。 さらに、これはC++の話になるのですが、STLというC++での標準的なライブラリではend()は何らかの終端ではなく終端の「次」を表します。 そういった前例から、endが最後の次を指すというのは特に珍しくない実装ではないかと思います。

koumei000
質問者

お礼

 回答ありがとうございます。  そういう仕様もあるのですね。ちょっと考えてみます。

関連するQ&A

  • アノテーションを利用したアクセサメソッドの自動定義というのは実現可能?

    近年、デフォルトコンストラクタと各フィールドに対するアクセサメソッド(setter/getter)を備えたJavaBeansが話題になっていると思います。例えばこんなクラス。 class TestBeans {  private int number;  public void setNumber(int number) {   this.number = number;  }  public int getNumber() {   return number;  } } しかし、フィールドの数が増えてくると、コードがどんどん冗長になってくると思います。 そこで、ふと思ったのですが、リフレクションとJDK5のアノテーションを使って、下記のようにスッキリとアクセサメソッドが利用できるようになったりしないかなぁ、と。 class TestBeans {  @Getter @Setter  private int number; } こうすることによって、getNumber / setNumber が利用できるようになったりしないかな、ということです。 アノテーションの自作やリフレクションに関する知識が乏しいので、私にはよくわかりませんでした。 こういったことは実現可能なのでしょうか? また可能ならばどのように実装するのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • オブジェクト指向言語で多態性を意識した開発についてご指南お願い致します

    多態性を意識した開発を行う場合の良策をご教示ください。 ※私の知識が Java に限られるため、内容が Java 寄りになる可能性があります。その場合は申し訳ありません。 ただ、開発時の言語や、規模の大小にかかわらず必要な観点になるかと思い、このカテゴリを選択しました。 (質問) 例えばテキストフィールドを生成する API や、ボタンを生成する API 等を独自で作成(強化)したいと考えています。 その場合、呼び出し元の負担を軽減するために以下のいずれかの実装にしようと考えていますが、いずれの方法が妥当でしょうか? [1]個別のクラスを用意し、統一した名前のメソッドを用意する 実装例) class TextFieldFactory ( ) {  JTextField createItem ( int x ) {   return //テキストフィールドを返す  }  JTextField createItem ( int x, int y ) {   return //テキストフィールドを返す  } } class ButtonFactory ( ) {  JButton createItem ( int x ) {   return //ボタンを返す  }  JButton createItem ( int x, int y ) {   return //ボタンを返す  } } 上記の場合、呼び出し元からは『各ファクトリークラス名』と『作成時は createItem メソッドを使用する』事を認識していればよく、多態性は増すと考えています。 [2]特定の一つのクラスを用意し、各種メソッドを用意する 実装例) class ItemFactory ( ) {  JTextField createTextField ( int x ) {   return //テキストフィールドを返す  }  JTextField createTextField ( int x, int y ) {   return //テキストフィールドを返す  }  JButton createButton ( int x ) {   return //ボタンを返す  }  JButton createButton ( int x, int y ) {   return //ボタンを返す  } } 上記の場合、呼び出し元は『アイテム生成時は ItemFactory クラスのメソッドを使用する』事を認識していれば良く、多態性が増すと考えます。 反面、1つのソースの実装が膨大になる恐れも(!?) [3]その他の方法 その他、妙案がありますでしょうか? ※インターフェイス や 抽象クラス も考えましたが、返り値の相違やしグニチャの状況等より、結局[1]と同様、アイテムの種類分必要となるため、今回は検討項目に含めませんでしたが・・・。 経験豊富なプログラマの皆様、ぜひ妙案をご教示ください。

  • obj-c @synthesizeについて

    Objective-Cの入門書を読み進めているのですが、クラスを使いやすくするために、アクセサメソッド(ゲッターメソッド、セッターメソッド)を省略してプロパティを設定する、という事が書かれています。 プロパティ化した変数はインプリメントセクションで、必ず @synthesize と共に記述しなければならない、と覚えてしまってよいのでしょうか? @synthesizeがでてきたら、「あ、これはプロパティなんだな。インターフェースセクションで@property されてるな」と理解してしまってOKでしょうか? お詳しい方、よろしければご回答お願いいたします。

  • Javaのインターフェイスの意味

    以前あった質問の回答やネット上での説明を見たのですが、よくわからなかったので質問します。 public interface CharSequence { int length(); } class MyClassWithCharSequenceIF implements CharSequence { public int length() { return 0; } } インターフェイスには、よく多重継承を可能にするメリットがあるという説明がありますが、 public interface CharSequence { int length(); } こんな短い処理を継承する意味があるのでしょうか?クラス内で実装するためにまた public int length() { return 0; } を書かなければならないのは時間・手間のメリットは何もないように思えます。というよりむしろ単なる二度手間ではないでしょうか? クラスの継承は長い記述などを一まとめにして呼び出せるメリットがありますが、インターフェイスの継承にはそれがありません。 いったい何の意味があるんでしょうか?

    • ベストアンサー
    • Java
  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • 下記のメソッドを使って答えが画面表示されるようにしたいです。

    下記のメソッドを使って答えが画面表示されるようにしたいです。 それには、どうコードを書けばいいでしょうか。 宜しく御願い申し上げます。 public class Calc {   int[] calcArr(int[] data){    int[] r =new int[data.length];      for(int i=0; i<data.length; i++)        r[i]=data[i]*data[i];         return r; }

    • ベストアンサー
    • Java
  • 配列のメソッド

    配列のメソッドをセッターしてゲッターで取得したいのですがどのようにすればいいのかわかりません(--;)セッターをまず作成しましたがエラーになって出来ません・・・どなたかお願いします。 ↓以下セッターです。 public class KanaHenkanData {   //全角を格納するメソッド   public char[] setZenkaraHan(char[] haze) {     //(全角)ア、イ、ウ、エ、オ・・・・     char[] zenkaku = {'ア','イ','ウ','エ','オ'};          //zenkakuを返す     return zenkaku;   }   //半角を格納するメソッド   public void setHankaraZen(int a,String[] zeha) {     //(半角)ア、イ、ウ、エ、オ・・・・     String[] hankaku = {"ア","イ","ウ","エ","オ};     //hankakuを返す     return hankaku;   } }

    • ベストアンサー
    • Java
  • ポインタ

    String String Mid(int start, int length) const { char *p="HelloWorld"; char s[100]; p+=start; for(int i=0;i<length;i++) { *s++=*p+;; } return s3; で++には左辺値が必要ですとでます。 stringクラスのMid関数を実装しているのですが start分ポインタを進めてlength取り出す関数なんですが ここまでは組んだのですが、うまくいきません。 どうすればうまくいきますか?

  • javaのソケット通信の受信で、InputStreamの終了が認識出来

    javaのソケット通信の受信で、InputStreamの終了が認識出来ません。 (1)下記のネット上で見つけたチャットクライアントのソース"ChatClient.java"を流用しました。  http://www.saturn.dti.ne.jp/~npaka/android/SocketEx/index.html  チャットサーバもこのサイトのソースを実装しました。この組み合わせで送受信は確認しました。 (2)これを下記のjavaのオープンソースを実装して、バイト読み出しに変更しました。  ・上記の元のソースの受信ループ中の読み出し部   size=in.read(w); → size=readsocket(w);  【"java\io\InputStream.java"より】   public int read(byte b[]) throws IOException {  //※1     return read(b, 0, b.length);      //※2   }   public int readsocket2(byte b[], int off, int len) throws IOException {//※3     if (b == null) {       throw new NullPointerException();     } else if ((off < 0) || (off > b.length) || (len < 0) ||         ((off + len) > b.length) || ((off + len) < 0)) {       throw new IndexOutOfBoundsException();     } else if (len == 0) {       return 0;     }     int c = read();    //※4     if (c == -1) {       return -1;     }     b[off] = (byte)c;     int i = 1;     try {       for (; i < len ; i++) {       c = in.read();       if (c == -1) {         break;       }       if (b != null) {         b[off + i] = (byte)c;       }       }     } catch (IOException ee) {     }     return i;   } ・上記の名前の付け替え   ※1:public int readsocket(byte b[]) throws IOException {   ※2:return readsocket2(b, 0, b.length);   ※3:public int readsocket2(byte b[], int off, int len) throws IOException {   ※4:int c = in.read(); (3)この変更を行うと、“in.read()”でストリームの終了の"-1"が入って来ず、forループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?

    • ベストアンサー
    • Java
  • return new使用時

    いつもお世話になっています。 return返却時に、newインスタンスを使用する場合、 newクラス名()、newクラス名().メソッド名()での返却が可能だと思うのですが、このような場合の実装方法はどうなるのでしょうか? 考えているのは、実装すると、 (1)、return new クラス名().メソッド名()で行う場合 public クラス名 method1() { return クラス名; //実現できない return このクラスに存在するメソッド名(); //OK return null; //OK } といった形になり、クラス名()が実装できない (2)、return new クラス名()で行う場合 public クラス名 method2() { return クラス名; //OK return null; //OK } となり、 (1)で返却された場合、返却されたメソッドの機能を持つことができると同時に、クラス自体の機能も持つ(この場合、クラスオブジェクトは持てず単にそのメソッドのみ使用可だと思っていたのですが...) (2)で返却された場合、返却されたクラスオブジェクトを持つことができる といった感じになります。 実際に、試したところ(1)と(2)でさほど変化がありません。 言いたいことは、 return時に、クラス名()で返却された場合、とクラス名().メソッド名()で返却された場合の違いと、 実際に使用されるのはどういったときかを教えて頂きたいのですが。 また、メソッドがつくのとつかない場合の違いはあったりするのでしょうか? 説明が不十分で申し訳ありません。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう