Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: массив объектов java как инициализировать коротко?

я недавно начал изучать java. до этого около года учу с++.
возникла сложность с массивом объектов в java.
я создаю такой код описан внизу.
возникает сложность инициализацией, где мне нужно еще инициализировать массив через цикл for.
есть более простой способ инициализировать массив объектов, похожий на с++ или хотя бы без цикла for.
я учу по книге " герберта шилда полное руководство java 8 " и нахожусь 198 стр, но я пока не встретил описания
по созданию массивов собственных классов.
спасибо заранее за помощь.
если можете, то посоветуйте заодно книги по java на русском, желательно java 8

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Girls {
public static void main(String args[])
{
    Models model[] = new Models[10];
    for (int i = 0; i < 10; i ++)
        model[i] = new Models();
    for(int i = 0; i < 10; i++)
        model[i].age = i;
    
    System.out.println(model.length);
    for(Models x: model)
        System.out.println(x.age);
}
Java
1
2
3
4
5
6
7
8
9
10
public class Models {
 public int age;
 public int raiting;
public int Get(){return age;}
Models()
{
    int age = 1;
    int raiting = 1;
}
}
Добавлено через 8 минут
я пробовал так
Java
1
Models model[] = new Models[10] ();
и так
Java
1
Models model[] = new Models()[10]; 
но выдает ошибку.
а мне нужно без цикла for
Ответ: Он нарушается если инициализировать переменную напрямую. А я это показал просто чтобы упростить пример.
А так нужно изменять данные через методы.
Но меня волнует. Можно ли массив без array и без цикла for сразу инициализировать конструкторами. Или это в языке не поддерживает?
Вопрос: Как создать +1 объект в массиве объектов?

Начинающий, камнями прошу не кидаться

Как создать динамический массив объектов я уже понял, а вот как добавить еще один элемент к уже существующему массиву я не понял. А так же как сочетать динамический массив объектов с конструктором класса и как добавить новый элемент к массиву?
см. комменты в коде...

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream> // Стандартный набор
#include <cstdlib> // либра для консоли
#include <string> // либра для system
 
class del
{
public:
    // Методы
    ~del() {} // Деструктор класса 
 
    del (int tt)    // Конструктор класса.
    {
        t = tt;     //t - индивидуальное число
    }
 
    // Переменные
    int t; //t - индивидуальное число
};
 
int main()
{
    // Переменные
    int c_i = 0; // номер в массиве
    int ttt = 2; // Число для объекта
    // Действие
    c_i = 1; 
    del* s = new del[c_i](ttt); // Пытаюсь сделать динамический массив объектов и воспользоваться конструктором, но не дает пользоваться конструктором.
    cout << s[0].t << endl; // Должен показать значение t (индивидуального числа объекта) объекта 0
    ttt += 3;   // теперь ttt = 5
    c_i += 1;   // теперь c_i = 2
    del* s = new del[c_i](ttt); // Попытка добавить еще один элемент в массив и новому элементу присвоить знч. индивидуального числа = 5
    cout << s[1].t << endl; // Должен показать значение t (индивидуального числа объекта) объекта 1
    system("pause");
    return 0;
}
Ответ:
Сообщение от babanty
так же как и с добавлением нового элемента в массив.
Еще раз: массивы в С++ не расширяемые.
Вопрос: Как создать динамический массив объектов?

Как создать динамически массив объектов?
Ответ: Товарищи! Такой вопрос. Хочу объявить глобальный динамический массив строк. Делаю всё как по правилам:
C++
1
array <String^>^ MyArray = gcnew array<String^>(30);
Но компилятор подчеркивает MyArray и пишет, что глобальная или статическая переменная не может быть управляемого типа "cli::array<Type> ^"
Как такой нюанс можно обойти?

Добавлено через 36 минут
А всё, простите, сам разобрался! Оказывается нужно объявить внутри класса и добавить static в начале объявления
Вопрос: Работа с массивом объектов или что-то в этом роде

Здравствуйте.
У меня есть цикл в котором происходит вывод таблицы с датами на 30 дней вперёд. Так же у меня есть сложный объект, в котором много различной информации. Обращение к элементам объекта выглядит так:
PHP
1
2
3
4
5
foreach($ChildHealthDay->GetChildHealthDayDataByDoctorIDResult->KeyValueOfdateTimeChildHealthDayData_SYtopWnD as $object)
{
    echo $object->Key;                                     //Выводится дата 
    echo $object->Value->AgeMax."<br>";          //Выводится число
}
Мне нужно, чтобы если среди дат, которые были выведены в таблице оказывается та, что есть в объекте, то рядом с датой вывелось ещё и число из объекта, соответствующее дате.

Я предполагаю, что разумно будет создать некий массив объектов и для каждой даты проверять входит ли она в этот массив. Погуглил, но ничего вразумительного не нашёл (наверное не так ищу). Можете набросать примерчик?
Ответ: Azdeman, да, возможно я и правда объяснил как-то не очень...
У меня есть код, который строит табличку с датами на 30 дней вперёд. На пример вот так:
PHP
1
2
3
4
5
6
7
8
echo "<TABLE border='1'>";
for($d = 0; $d < 30; $d++)
{
    $Date = date('Y-m-d', mktime(0, 0, 0, date("m"), date("d") + $d, date("Y")));
    echo "<TR align=center><TD width='5%'><b>".date_create($Date)->Format('d')."</b></TD>";
    echo "<TD width='30%'>какой-то текст</TD></TR>";
}
echo "</TABLE>";
И есть большой и сложный объект (полностью структуру не привожу т.к. она огромна, да и меня интересуют всего два поля). Достучаться до его элементов можно так:
PHP
1
2
3
4
5
foreach($ChildHealthDay->GetChildHealthDayDataByDoctorIDResult->KeyValueOfdateTimeChildHealthDayData_SYtopWnD as $object)
{
    echo $object->Key." ";                                     //Нужная мне дата 
    echo $object->Value->AgeMax."<br>";          //Нужное мне число
}
Так вот мне нужно в мою таблицу добавить число AgeMax в ячейку с соответствующей датой.
На пример у нас в результате работы цикла foreach на экран вывелось:
22.01.2016 7
29.02.2016 9
Соответственно в таблице в соответствующую строку помимо самой даты 22.01.2016 должно ещё попасть число 7.

Для этого я хотел создать массив объектов, состоящих из двух полей (датой и числом) и в цикле для каждой даты прохдиться по этому массиву и искать соответствие дат. Как это сделать? Или всё можно сделать значительно проще?
Вопрос: Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)

Здравствуйте. Стоит задача записать в бинарный файл массив объектов student:
C++
1
2
3
4
5
6
7
8
9
10
class student
{
    string firstname,lastname, group;
    char year;
    bool sex;
public:
    void setStudent();
    bool getSex() { return sex; }
    friend ostream& operator<<(ostream &os, student &s);
};
, после чего вывести на экран из файла студентов женского пола. Я эту функцию реализовал так:
C++
1
2
3
4
5
6
7
8
9
void RD(ifstream &f) 
{
    student t;
    f.open("INFO.DAT",ios::binary);
    if (f.is_open())
        while ((f.read((char*)&t, sizeof(t))))
            if (!(t.getSex())) cout << t;
    f.close();
}
Она работает, но итераций производится на одну больше, чем есть записей в файле, в результате чего возникает ошибка доступа. Интересно то, что если в hex-редакторе дописать в конец файла 88 байт (а именно 88 байт занимает один объект класса student), из которых все, кроме 85-го (пол - поставим 0x01 - мужской) и 88-го (0x1A - как я понял, конец файла), то файл читается нормально. В чем здесь ошибка?

Добавлено через 13 минут
Прошу прощения, опечатался: не массив объектов, просто объекты последовательно
Ответ:
Сообщение от artem2302
string firstname,lastname, group;
Классы с такими полями не годятся для стандартных бинарных методов записи/чтения.

Добавлено через 3 минуты
Вопрос: Как определить какой объект массива SP[n] перемещают?

Коллеги, привет.

Есть массива 2 динамических объектов: Окружность (SP) и пронумерованная надпись внутри объекта (LblPhoto).

Вопрос: Как определить какой объект массива SP[n] перемещают?


(SP[CurPhoto].OnTrack)

LblPhoto[n].position.y:=SP[n]position.x 



var 
SP: array [0..10] of TSelectionPoint; // Окружность
LblPhoto: array [0..10] of TLabel; // Надпись внутри окружности

// Добавление новой окружности
Procedure AddObjectPoint(X,Y:Single);
begin
  //
if CurPhoto>10 then
  begin
   ShowMessage('Превышено максимальное количество ');
   exit;
  end;


        with dyn_frm do
         begin
             SP[CurPhoto]:=TSelectionPoint.Create(ImageViewer1); //
             SP[CurPhoto].Parent:=ImageViewer1;

             LblPhoto[CurPhoto]:=TLabel.Create(ImageViewer1); //
             LblPhoto[CurPhoto].Parent:=ImageViewer1;


            SP[CurPhoto].position.y:=y-120;
            SP[CurPhoto].position.x:= x;
            SP[CurPhoto].Width:=80;
            SP[CurPhoto].Scale.X:=6;
            SP[CurPhoto].Scale.Y:=6;
            SP[CurPhoto].OnClick:=PhotoDialogClick;
            SP[CurPhoto].OnTrack:=SelectionPoint1Track; // Прикручиваем обработчик перемещения объекта


            LblPhoto[CurPhoto].Position.Y:=SP[CurPhoto].position.y-10;
            LblPhoto[CurPhoto].Position.X:=SP[CurPhoto].position.x-10;
            LblPhoto[CurPhoto].Text:=IntToStr(CurPhoto+1);


            Inc(CurPhoto);
         end;
end;



// Обработчик перемещения окружности и перемещения надписи внутри
procedure dyn_frm.SelectionPoint1Track(Sender: TObject;
  var X, Y: Single);
begin
 LblPhoto[?].Position.X:=X-10;
 LblPhoto[?].Position.Y:=Y-10;
end;





//





С наилучшими пожеланиями,
Андрей,
Ответ: Коллеги, спасибо, все получилось!

Сделал так:

Процедура создания объектов:


        with dyn_frm do
         begin
             SP[CurPhoto]:=TSelectionPoint.Create(ImageViewer1); //
             SP[CurPhoto].Parent:=ImageViewer1;

             LblPhoto[CurPhoto]:=TLabel.Create(ImageViewer1); //
             LblPhoto[CurPhoto].Parent:=ImageViewer1;


            SP[CurPhoto].position.y:=y-120;
            SP[CurPhoto].position.x:= x;
            SP[CurPhoto].Width:=80;
            SP[CurPhoto].Scale.X:=6;
            SP[CurPhoto].Scale.Y:=6;
            SP[CurPhoto].OnClick:=PhotoDialogClick;
            SP[CurPhoto].OnTrack:=SelectionPoint1Track;
            SP[CurPhoto].tag:=CurPhoto; // Добавил

            LblPhoto[CurPhoto].Position.Y:=SP[CurPhoto].position.y-10;
            LblPhoto[CurPhoto].Position.X:=SP[CurPhoto].position.x-10;
            LblPhoto[CurPhoto].Text:=IntToStr(CurPhoto+1);


            Inc(CurPhoto);
         end;



Процедура отлавливания события:


procedure dyn_frm.SelectionPoint1Track(Sender: TObject;
  var X, Y: Single);
begin


// ShowMessage(IntToStr(TSelectionPoint(Sender).Tag));
 LblPhoto[TSelectionPoint(Sender).Tag].Position.X:=X-10;
 LblPhoto[TSelectionPoint(Sender).Tag].Position.Y:=Y-10;


end;
Вопрос: Ошибка в массиве объектов

Добрый вечер. Буквально недавно начал изучать яву, и для пробного захода написал программку, где в одном классе хранятся данные для студента (имя, балл и возраст). Ну и потом с этим некоторые операции производятся.
В главном классе я создаю массив из объектов, а потом в цикле забиваю их данными, но тут появляется ошибка. Прошу ткнуть меня носом туда, где накосячил

Главный класс:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package jl1;
 
import javax.swing.*;
 
 
public class Jl1{
    static int maxball(student[] st, int n){
        int max=0;
        int num=0;
        for (int i=0;i<n;i++) 
            if (st[i].getBall()>max){
                num=i;
                max=st[i].getBall();
            }
        return num;
    }
    public static void main(String[] args){
        int n=Integer.parseInt(JOptionPane.showInputDialog("Enter student's amount."));
        student[] s=new student[n];
        for (int i=0;i<n;i++){
            s[i].setName(JOptionPane.showInputDialog("Enter "+i+" student's name."));
            s[i].setAge(Integer.parseInt(JOptionPane.showInputDialog("Enter "+i+" student's age.")));
            s[i].setBall(Integer.parseInt(JOptionPane.showInputDialog("Enter "+i+" student's ball.")));
        }
        JOptionPane.showMessageDialog(null, "Max ball: \nName: "+s[maxball(s,n)].getName()+"\nBall: "+s[maxball(s,n)].getBall());
    }
}

Класс студентов:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package jl1;
 
public class student{
    private String name;
    private int age,ball;
    public int getAge(){
        return this.age;
    }
    public void setAge(int value){
        this.age=value;
    }
    public String getName(){
        return this.name;
    }
    public void setName(String value){
        this.name=value;
    }
     public int getBall(){
        return this.ball;
    }
    public void setBall(int value){
        this.ball=value;
    }
}
Ошибка:
Java
1
2
3
4
Exception in thread "main" java.lang.NullPointerException
    at jl1.Jl1.main(Jl1.java:21)
/home/dmitry/.cache/netbeans/8.2/executor-snippets/run.xml:53: Java returned: 1
BUILD FAILED (total time: 5 seconds)
Ответ: создать обхект, положить в массив
Вопрос: Как КОРРЕКТНО реализовать обработчик нажатия клавиши для массива объектов?

Сделал программу движения шарика по нажатию клавиши:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Program keyEvent; 
uses GraphABC, Events;  { подключение модулей } 
 
Type  Krug = class
private
      x,y,R: integer;     //поле
      col: color;
public
      Constructor Create(InitX, InitY, InitR: Integer; InitColor: Color);
      Procedure Keydown(key: integer);
      Procedure Hide;
      Procedure Draw;
      Procedure MoveByKeystroke;
end;
 
{МЕТОДЫ КЛАССА Krug}
Constructor Krug.Create(InitX, InitY, InitR: Integer; InitColor: Color);
begin
  x := InitX;
  y := InitY;
  R := InitR;
  col := InitColor;
end;
 
procedure Krug.Draw;  { процедура рисования круга } 
begin 
    SetPenColor(clWhite); SetBrushColor(col);  Circle(x,y,R); 
end; 
 
procedure Krug.Hide;  { процедура стирания круга } 
begin 
    SetPenColor(clWhite); SetBrushColor(clWhite);  Circle(x,y,R); 
end; 
 
procedure Krug.Keydown(key: integer);  { процедура обработки нажатия клавиш } 
begin 
    case key of
    VK_Left:    x:=x-1;  { влево } 
    VK_Right:   x:=x+1;   { вправо } 
    VK_Up:      y:=y-1;  { вверх } 
    VK_Down:    y:=y+1;   { вниз } 
    VK_Escape:  CloseWindow;  { закрыть окно } 
    end;
end; 
 
Procedure Krug.MoveByKeystroke;
begin
  Hide;
  OnKeyDown:=Keydown; //вызываем обработчик нажатия клавиши
  Draw;
end;
 
Const n = 100;
MaxX=600;
MaxY=400;
 
Var f:boolean;
    k:Krug;
    i:integer;
 
begin 
setWindowSize(MaxX,MaxY); 
k:=Krug.Create(100, 100, 30, clRed);
k.Draw;
 
lockdrawing;
f:=false;
repeat
k.MoveByKeystroke;
redraw;
sleep(10);
until f;
end.
Двигается.

Сделал то же самое для массива шариков... почему-то двигаются при нажатии клавиш с разной скоростью...

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
Program keyEvent; 
uses GraphABC, Events;  { подключение модулей } 
 
Type  Krug = class
private
      x,y,R: integer;     //поле
      col: color;
public
      Constructor Create(InitX, InitY, InitR: Integer; InitColor: Color);
      Procedure Keydown(key: integer);
      Procedure Hide;
      Procedure Draw;
      Procedure MoveByKeystroke;
end;
 
{МЕТОДЫ КЛАССА Krug}
Constructor Krug.Create(InitX, InitY, InitR: Integer; InitColor: Color);
begin
  x := InitX;
  y := InitY;
  R := InitR;
  col := InitColor;
end;
 
procedure Krug.Draw;  { процедура рисования круга } 
begin 
    SetPenColor(clWhite); SetBrushColor(col);  Circle(x,y,R); 
end; 
 
procedure Krug.Hide;  { процедура стирания круга } 
begin 
    SetPenColor(clWhite); SetBrushColor(clWhite);  Circle(x,y,R); 
end; 
 
procedure Krug.Keydown(key: integer);  { процедура обработки нажатия клавиш } 
begin 
    case key of
    VK_Left:    x:=x-1;  { влево } 
    VK_Right:   x:=x+1;   { вправо } 
    VK_Up:      y:=y-1;  { вверх } 
    VK_Down:    y:=y+1;   { вниз } 
    VK_Escape:  CloseWindow;  { закрыть окно } 
    end;
end; 
 
Procedure Krug.MoveByKeystroke;
begin
  Hide;
  OnKeyDown:=Keydown; //вызываем обработчик нажатия клавиши
  Draw;
end;
 
Const n = 100;
MaxX=600;
MaxY=400;
 
Var f:boolean;
    mas:Array [1..n] of Krug;
    i:integer;
 
begin 
 
for i:=1 to n do
begin
  MAS[i]:=Krug.Create(Random(MaxX),Random(MaxY),Random(20),clRandom);
  MAS[i].Draw;
end;
 
f:=false;
lockdrawing;
repeat
for i:=1 to n do
begin
  MAS[i].MoveByKeystroke;
  sleep(10);
end;
redraw;
sleep(100);
until f;
 
end.
Как это оптимизировать, чтобы двигались одинаково, сплошной картинкой?
И вопрос по первому листингу - почему при работе программы от шарика остается "шлейф" при движении???
Ответ: Средство от шлейфа - увеличить на 1 пиксель круг стирающий.

Pascal
1
2
3
4
procedure Krug.Hide;  { процедура стирания круга } 
begin 
    SetPenColor(clWhite); SetBrushColor(clWhite);  Circle(x,y,R+1); 
end; 
Добавлено через 5 минут
В комплекте с паскалем идет пример движения кучи объектов, посмотрите как организовано:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uses ABCObjects,GraphABC,Utils;
 
const 
/// Количество графических объектов
  Count = 300;
/// Флаг ускорения анимации
  AnimationIsFast = True;
  
/// Возвращает случайный графический объект
function NewRandomABC: ObjectABC;
begin
  case Random(3) of
0: Result := new CircleABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(10)+5,clRandom);
1: Result := new RectangleABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(20)+10,Random(20)+10,clRandom);
2: Result := new StarABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(20)+10,Random(10)+5,Random(4)+4,clRandom);
  end;
end;
 
/// Передвигает графический объект с отражением его от стенок
procedure Move(o: ObjectABC);
begin
  o.Move;
  if (o.Left<0) or (o.Left+o.Width>WindowWidth) then
    o.dx := -o.dx;
  if (o.Top<0) or (o.Top+o.Height>WindowHeight) then
    o.dy := -o.dy;
end;
 
begin
  Window.Title := 'Движущиеся объекты';
  if AnimationIsFast then
    LockDrawingObjects;
  for var i:=1 to Count do
  begin
    var m: ObjectABC := NewRandomABC;
    repeat
      m.dx := Random(-3,3);
      m.dy := Random(-3,3);
    until (m.dx<>0) and (m.dy<>0);
  end;
  var k := 1;
  while True do
  begin
    for var i:=0 to Objects.Count-1 do
      Move(Objects[i]);
    if AnimationIsFast then
      RedrawObjects;
    k += 1;
    Window.Title := Format('{0,5:f2}',k/Milliseconds*1000)+' кадров в секунду';
  end;
end.
Вопрос: Создать массив объектов

Может у кого есть какие-нибудь мысли или заготовки...
Спасибо.
Создать класс, спецификация которого приведена ниже. Определить конструктор и методы setТип(), getТип(), showИнформ(). Реализовать класс в консольном приложении. Определить дополнительно методы в классе, создающем массив объектов. Задать критерий выбора данных и вывести эти данные на консоль.
Student: id, Фамилия, Имя, Отчество, Дата рождения, Адрес,
Телефон, Факультет, Курс, Группа.
Создать массив объектов. Вывести:
1 список студентов заданного факультета;
2 списки студентов для каждого факультета и курса;
3 список студентов, родившихся после заданного года;
4 список учебной группы.
Ответ: Вывод компилятора:
Exception in thread "main" java.lang.NullPointerException

Добавлено через 1 минуту
Думаю maxii прав. Подборка бы пригодилась
Вопрос: Поле класса - массив объектов другого класса

Здравствуйте.
У меня определен класс Article, в котором определен конструктор по умолчанию.
Затем определяю класс Magazine, в котором одним из полей является массив объектов Article.
В обоих конструкторах этого класса есть определение нулевого элемента через конструктор по-умолчанию. А также метод добавления нового объекта в массив.
но при компиляции выдает ошибку System NullReferenceException (ссылка на объект не указывает на экземпляр объекта)
Как правильно оформить массив объектов в поле? желательно убрать определение 0го элемента массива по умолчанию из конструктора с параметрами.

C#
1
2
3
4
5
class Article
        {
            public Person author { get; set; }
            public string article_name { get; set; }
            public double article_rate { get; set; }
C#
1
2
3
4
5
6
7
public Article()
            {
                author = new Person();
                article_name = "article";
                article_rate = 0;
                
            }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Magazine
    {
 
        private string mag_name { get; set; }
        private Frequency mag_freq { get; set; }
        private DateTime mag_date { get; set; }
        private int mag_quant { get; set; }
        private Article[] mag_article{ get; set; }
 
            public Magazine(string N, Frequency F, DateTime D, int Q)
            {
                mag_name = N;
                mag_freq = F;
                mag_date = D;
                mag_quant = Q;
                mag_article[0] = new Article();
            }
            public Magazine()
            {
                mag_name = "Magazine";
                mag_freq = 0;
                mag_date = new DateTime(1990, 01, 01);
                mag_quant = 0;
                mag_article[0] = new Article();
            }
Ответ:
Сообщение от dimitrykorno
К сожалению, списки использовать нельзя. нужен именно массив(задание для универа).
Тогда инициализуйре массив

C#
1
mag_article = new Article[10]; //укажите нужную длину массива