Как найти индекс элемента в массиве в Java?

Да, просто добавьте конструктора для Грузоперевозок. Вы, вероятно, захотите добавить конструктора к Автомобилю также, хотя не обязательно общедоступный:

public class Car {
    protected Car(Car orig) {
    ...
}

public class Truck extends Car {
    public Truck(Car orig) {
        super(orig);
    }
    ...
}

, Как правило, обычно лучше сделать классы любым листом (и Вы могли бы хотеть отметить окончательных), или краткий обзор.

выглядит, как будто Вы хотите Car объект и затем имеете тот же экземпляр, превращаются Truck. Лучший способ сделать это состоит в том, чтобы делегировать поведение к другому объекту в Car (Vehicle). Так:

public final class Vehicle {
    private VehicleBehaviour behaviour = VehicleBehaviour.CAR;

    public void becomeTruck() {
        this.behaviour =  VehicleBehaviour.TRUCK;
    } 
    ...
}

, Если Вы реализуете Cloneable тогда, можно "автоматически" скопировать объект в экземпляр того же класса. Однако существует много проблем с этим, включая необходимость скопировать каждое поле изменяемых объектов, которое подвержено ошибкам и запрещает использование финала.

46
задан 9 November 2011 в 00:17
поделиться

7 ответов

В этом случае вы могли бы создать новую строку из вашего массива символов, а затем выполнить indeoxOf ("e") для этой строки:

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

Но в других случаях примитивных типов данных вам придется повторять над ним.

51
ответ дан 26 November 2019 в 20:13
поделиться

Если начальный порядок элементов не очень важен, вы можете просто отсортировать массив, а затем выполнить двоичный поиск:

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
ответ дан 26 November 2019 в 20:13
поделиться

Теперь он печатает 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
ответ дан 26 November 2019 в 20:13
поделиться

Очень сильно отредактировано. Я думаю, что либо вам нужно следующее:

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'];
    }
}

(Обратите внимание, что вам, возможно, придется настроить метод инициализации, если вы хотите использовать 1-26 вместо 0-25)

, либо вы хотите это:

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

Второй - if вы всегда хотите a = 1, z = 26. Первый позволит вам ввести строку типа «qwerty» и присвоить q = 0, w = 1, e = 2, r = 3 ...

1
ответ дан 26 November 2019 в 20:13
поделиться

Проблема с вашим кодом заключается в том, что когда вы выполняете

 list[] == "e"

, вы спрашиваете, равен ли объект массива (а не его содержимое) строке «e», что явно не является case.

Вы захотите перебрать содержимое, чтобы выполнить нужную проверку:

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }
4
ответ дан 26 November 2019 в 20:13
поделиться

Я считаю, что единственный самый разумный способ сделать это - вручную перебирать массив.

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}
8
ответ дан 26 November 2019 в 20:13
поделиться

Это даже неверно синтаксис. И вы пытаетесь сравнить со строкой. Для массивов вам придется пройти по массиву самостоятельно:

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 , вы также можете использовать метод 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
ответ дан 26 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: