Javaで、その内容を知っている特定の要素のインデックスを探しています。
動作しない次の例を試しました。
class masi {
public static void main( String[] args ) {
char[] list = {'m', 'e', 'y'};
// should print 1
System.out.println(list[] == "e");
}
}
誰がこれの何が間違っているのか、それを修正するために私が何をする必要があるのか説明してもらえますか?
この場合、文字の配列からeという新しい文字列を作成し、その文字列に対してindeoxOf( "e")を実行できます。
System.out.println(new String(list).indexOf("e"));
ただし、プリミティブデータ型のその他の場合は、繰り返し処理する必要があります。
または、Commons Lang ArrayUtils classを使用できます。
int[] arr = new int{3, 5, 1, 4, 2};
int indexOfTwo = ArrayUtils.indexOf(arr, 2);
さまざまな配列タイプに対して、indexOf()
メソッドのオーバーロードされたバリアントがあります。
それは有効な構文でもありません。 そして文字列と比較しようとしています。配列の場合、配列を自分で歩く必要があります。
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'));
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.range
、 indexes 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
を呼び出すと、配列の要素のリストではなく、指定された配列である単一の要素のリストが作成されます。
私は信じます のみ これを行う最も簡単な方法は、配列を手動で繰り返すことです。
for (int i = 0; i < list.length; i++) {
if (list[i] == 'e') {
System.out.println(i);
break;
}
}
あなたのコードの問題は、あなたがするとき
list[] == "e"
配列オブジェクト(内容ではなく)が文字列 "e"と等しいかどうかを尋ねていますが、明らかにそうではありません。
必要なチェックを行うために、コンテンツを反復処理する必要があります。
for(String element : list) {
if (element.equals("e")) {
// do something here
}
}
最も簡単なソリューション:
配列をリストに変換すると、要素の位置を取得できます。
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;
}
}
今では印刷します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文字列関数を使用するだけで、任意のアルファベット(または文字の配列)内の任意の文字を見つけることができます
非常に大きく編集されました。私はあなたがこれを望んでいると思います:
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 ...を割り当てます。
別の例とindexOf
の動作方法を次に示します。
public int indexOf(Object target) {
for (int i = 0; i < array.length; i++) {
if (equals(target, array[i])) {
return i;
}
}
return -1;
}
この方法で動作するはずです。「char」を「Character」に変更します。
public static void main(String[] args){
Character[] list = {'m', 'e', 'y'};
System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
}
要素の初期順序があまり重要でない場合は、配列を並べ替えてからバイナリ検索するだけで済みます。
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') );
}
}
これを行うための適切な方法を提供しています
/**
* 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;
}