Да, просто добавьте конструктора для Грузоперевозок. Вы, вероятно, захотите добавить конструктора к Автомобилю также, хотя не обязательно общедоступный:
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
тогда, можно "автоматически" скопировать объект в экземпляр того же класса. Однако существует много проблем с этим, включая необходимость скопировать каждое поле изменяемых объектов, которое подвержено ошибкам и запрещает использование финала.
В этом случае вы могли бы создать новую строку из вашего массива символов, а затем выполнить indeoxOf ("e") для этой строки:
System.out.println(new String(list).indexOf("e"));
Но в других случаях примитивных типов данных вам придется повторять над ним.
Если начальный порядок элементов не очень важен, вы можете просто отсортировать массив, а затем выполнить двоичный поиск:
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') );
}
}
Теперь он печатает 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'];
}
}
(Обратите внимание, что вам, возможно, придется настроить метод инициализации, если вы хотите использовать 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 ...
Проблема с вашим кодом заключается в том, что когда вы выполняете
list[] == "e"
, вы спрашиваете, равен ли объект массива (а не его содержимое) строке «e», что явно не является case.
Вы захотите перебрать содержимое, чтобы выполнить нужную проверку:
for(String element : list) {
if (element.equals("e")) {
// do something here
}
}
Я считаю, что единственный самый разумный способ сделать это - вручную перебирать массив.
for (int i = 0; i < list.length; i++) {
if (list[i] == 'e') {
System.out.println(i);
break;
}
}
Это даже неверно синтаксис. И вы пытаетесь сравнить со строкой. Для массивов вам придется пройти по массиву самостоятельно:
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'));