web-dev-qa-db-ja.com

Javaの配列内の要素のインデックスを見つける方法は?

Javaで、その内容を知っている特定の要素のインデックスを探しています。

動作しない次の例を試しました。

class masi { 
    public static void main( String[] args ) { 
        char[] list = {'m', 'e', 'y'};

        // should print 1
        System.out.println(list[] == "e");                    
    } 
}

誰がこれの何が間違っているのか、それを修正するために私が何をする必要があるのか​​説明してもらえますか?

46
anon

この場合、文字の配列からeという新しい文字列を作成し、その文字列に対してindeoxOf( "e")を実行できます。

System.out.println(new String(list).indexOf("e")); 

ただし、プリミティブデータ型のその他の場合は、繰り返し処理する必要があります。

49
Bart Kiers

または、Commons Lang ArrayUtils classを使用できます。

int[] arr = new int{3, 5, 1, 4, 2};
int indexOfTwo = ArrayUtils.indexOf(arr, 2);

さまざまな配列タイプに対して、indexOf()メソッドのオーバーロードされたバリアントがあります。

17
Max77

それは有効な構文でもありません。 そして文字列と比較しようとしています。配列の場合、配列を自分で歩く必要があります。

public class T {
  public static void main( String args[] ) {
    char[] list = {'m', 'e', 'y'};

    int index = -1;

    for (int i = 0; (i < list.length) && (index == -1); i++) {
        if (list[i] == 'e') {
            index = i;
        }
    }

    System.out.println(index);
  }
}

ArrayList<Character>などのコレクションを使用している場合は、indexOf()メソッドも使用できます。

ArrayList<Character> list = new ArrayList<Character>();
list.add('m');
list.add('e');
list.add('y');

System.out.println(list.indexOf('e'));

上記のコードを短縮するArraysクラスもあります。

List list = Arrays.asList(new Character[] { 'm', 'e', 'y' });
System.out.println(list.indexOf('e'));
17
Joey

プリミティブ配列の場合

Java 8以降、プリミティブ配列arrの汎用ソリューションと、valを検索する値は次のとおりです。

public static int indexOf(char[] arr, char val) {
    return IntStream.range(0, arr.length).filter(i -> arr[i] == val).findFirst().orElse(-1);
}

このコードは、 IntStream.rangeindexes the filters を使用して配列のインデックスにストリームを作成し、そのインデックスの配列の要素が検索された値と等しくなり、最終的に findFirst と一致する最初のものを保持します。 findFirstは、一致するインデックスが見つからなかった可能性があるため、 OptionalInt を返します。 orElse(-1) を呼び出して、見つかった値を返すか、見つからなかった場合は-1を返します。

int[]long[]などにオーバーロードを追加できます。メソッドの本体は同じままです。

オブジェクト配列の場合

String[]のようなオブジェクト配列の場合、同じアイデアを使用し、 equals メソッドを使用するフィルタリングステップ、または Objects.equals を使用して、2つのnull要素が等しいと見なすことができます == の代わりに。

ただし、次の方法でより簡単に行うことができます。

public static <T> int indexOf(T[] arr, T val) {
    return Arrays.asList(arr).indexOf(val);
}

これは、 Arrays.asList を使用して入力配列のリストラッパーを作成し、 indexOf を使用して要素のインデックスを検索します。

このソリューションは、プリミティブ配列では機能しません。 ここに示すとおりint[]のようなプリミティブ配列はObject[]ではなく、Objectです。そのため、asListを呼び出すと、配列の要素のリストではなく、指定された配列である単一の要素のリストが作成されます。

10
Tunaki

私は信じます のみ これを行う最も簡単な方法は、配列を手動で繰り返すことです。

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}
7
Matt Solnit

あなたのコードの問題は、あなたがするとき

 list[] == "e"

配列オブジェクト(内容ではなく)が文字列 "e"と等しいかどうかを尋ねていますが、明らかにそうではありません。

必要なチェックを行うために、コンテンツを反復処理する必要があります。

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }
4
Peter

最も簡単なソリューション

配列をリストに変換すると、要素の位置を取得できます。

List<String> abcd  = Arrays.asList(yourArray);
int i = abcd.indexOf("abcd");

その他のソリューション、イテレータ配列を使用できます:

int position = 0;
for (String obj : yourArray) {
    if (obj.equals("abcd") {
    return position;
    }
    position += 1;
} 

//OR
for (int i = 0; i < yourArray.length; i++) {
    if (obj.equals("abcd") {
       return i;
    }
}
3
MeosCoder

今では印刷します1

class Masi {
    public static void main( String [] args ) {
         char [] list = { 'm', 'e', 'y' };

         // Prints 1
         System.out.println( indexOf( 'e', list ) );
    }

    private static int indexOf( char c , char [] arr ) {
        for( int i = 0 ; i < arr.length ; i++ ) {
            if( arr[i] == c ) { 
                return i;
            }
         }
         return -1;
     }
 }

覚えておいてください

"e"

文字列オブジェクトリテラル(文字列オブジェクトを表します)

ながら

「e」

文字リテラル(文字プリミティブデータ型を表す)

ときでさえ

list[]

正当なJava(そうではない)は、文字要素と文字列要素を比較すると、いずれにしてもfalseを返します。

そのindexOf文字列関数を使用するだけで、任意のアルファベット(または文字の配列)内の任意の文字を見つけることができます

2
OscarRyz

非常に大きく編集されました。私はあなたがこれを望んでいると思います:

class CharStorage {
    /** set offset to 1 if you want b=1, o=2, y=3 instead of b=0... */
    private final int offset=0;
    private int array[]=new int[26];

    /** Call this with up to 26 characters to initialize the array.  For 
      * instance, if you pass "boy" it will init to b=0,o=1,y=2.
      */
    void init(String s) {
        for(int i=0;i<s.length;i++)
            store(s.charAt(i)-'a' + offset,i); 
    }

    void store(char ch, int value) {
        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
        array[ch-'a']=value;
    }

    int get(char ch) {
        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
        return array[ch-'a'];
    }
}

(0-25の代わりに1-26を使用したい場合は、initメソッドを調整する必要があることに注意してください)

またはあなたはこれが欲しい:

int getLetterPossitionInAlphabet(char c) {
    return c - 'a' + 1
}

2番目は、常にa = 1、z = 26が必要な場合です。 1つ目は、「qwerty」などの文字列を入力し、q = 0、w = 1、e = 2、r = 3 ...を割り当てます。

1
Bill K

別の例とindexOfの動作方法を次に示します。

public int indexOf(Object target) {
    for (int i = 0; i < array.length; i++) {
        if (equals(target, array[i])) {
            return i;
        }
    }
    return -1;
}
1
Salvador Vigo

この方法で動作するはずです。「char」を「Character」に変更します。

public static void main(String[] args){
  Character[] list = {'m', 'e', 'y'};
  System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
}
1
Kehe CAI

要素の初期順序があまり重要でない場合は、配列を並べ替えてからバイナリ検索するだけで済みます。

import Java.util.Arrays;

class masi { 
    public static void main( String[] args ) { 
        char[] list = {'m', 'e', 'y'};
        Arrays.sort(list);

        // should print 0, as e is now sorted to the beginning
        // returns negative number if the result isn't found
        System.out.println( Arrays.binarySearch(list, 'e') );
    } 
}
0
Powerlord

これを行うための適切な方法を提供しています

/**
     * Method to get the index of the given item from the list
     * @param stringArray
     * @param name
     * @return index of the item if item exists else return -1
     */
    public static int getIndexOfItemInArray(String[] stringArray, String name) {
        if (stringArray != null && stringArray.length > 0) {
            ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
            int index = list.indexOf(name);
            list.clear();
            return index;
        }
        return -1;
    }
0
Manmohan Soni