Войти

Показать полную графическую версию : Тип RECORD


ManHack
29-09-2009, 13:55
Здравствуйте!
Как в Java реализуется тип, аналогичный типу запись (RCORD) в языке Pascal?
Хотя бы как такой тип на Java называется?....

Cornknight
29-09-2009, 17:06
Как в Java реализуется тип, аналогичный типу запись (RCORD) в языке Pascal?
Хотя бы как такой тип на Java называется? »

А зачем?

Записи в Паскале нужны для хранения набора данных разных типов, если я правильно понимаю. Паскаль не объектно-ориентированный язык, поэтому для такой задачи ему требуется специальная структура - Record. А в Java любой класс может хранить набор гетерогенных данных.

Например, можно написать так:

class MyRecord {
public static int X;
public static String Y;
public static double Z;
}

И обращаешься к нему как к записи в Паскале:

MyRecord.X = 1;
MyRecord.Y = "xxx";

Или если не хочешь глобального доступа, тогда так:

class MyRecord {
public int X;
public String Y;
public double Z;
}

MyRecord myRecord = new MyRecord ();

myRecord.X = 1;
myRecord.Y = "xxx";
myRecord.Z = 2.2;

Вот тебе и аналог простой записи. Если немного поднапрячься, можно реализовать аналог вариантной записи. Когда у нас есть классы, необходимость в записях как таковых отпадает начисто.

ManHack
29-09-2009, 20:54
Спасибо! Я написал таким образом сортировку простым (прямым) выбором:

public class Element {
public String Data; // здесь вставлял static после public, но компилятор выразил негодование: "This field can't be declared static. Static fields can only be declared in static or top level types"... На dynamic он ещё больше рассердился xD
public String Key; // аналогично... дак почему статик нельзя? что значит static or top level TYPE? Я вообще TYPE в своей программе не использую
}

public static void SelectSort (Element[] a, int n) {
int i, j, jmin;
Element buf;
for ( i = 0; i < n - 1; i++) {
jmin = 1;
for ( j = i + 1; i < n; i++) {
if (a[j].key < a[jmin].key) {
jmin = j;
}
}
buf = a[i];
a[i] = a[jmin];
a[jmin] = buf;
}
}


С точки зрения языка код написан правильно? Или надо что-то изменить? Класс Element определён на месте?

Cornknight
30-09-2009, 08:08
С точки зрения языка код написан правильно? Или надо что-то изменить? Класс Element определён на месте? »

Код у тебя скорей всего приведён не полностью. Поэтому трудно сказать что на месте, а что нет. :) Могу только предположить, что Element у тебя является внутренним классом по отношению к другому (то есть он определён внутри другого класса). А внутренним классам Java запрещает иметь static элементы, поэтому компилятор и ругается. Top level type - это как раз про внешний класс. Объяви весь класс Element как static или вынеси его за пределы внешнего класса и всё будет OK. Только когда будешь выносить, учти, что по правилам в одном файле может быть только один public класс, поэтому Element либо не должен быть public, либо нужно его вынести в отдельный файл.

Поехали дальше :)

static в данном контексте вообще не требуется. Более того, сортировка не получится, потому что static поля являются глобальными по отношению ко всему классу, то есть для каждого экземпляра класса их значение всегда будет одним и тем же.

Сравнивать так: if (a[j].Кey < a[jmin].Кey) нельзя, потому что Key у тебя String, а не число. И вообще кey у тебя с маленькой буквы, а в Java в отличие от Паскаля идентификаторы чувствительны к регистру. key и Key - разные вещи.

Для пары "ключ - данные" есть специальные типы, например HashMap, и свой собственный тип создавать не надо. В HashMap, например можно добыть данные по ключу, получать список ключей и много ещё чего полезного там есть.

Для сортировки в принципе не требуется писать специальных методов, в Java есть встроенные механизмы. Например, вот - http://www.javaportal.ru/java/articles/sort.html

Вроде всё. :)

ManHack
30-09-2009, 22:13
Для пары "ключ - данные" есть специальные типы, например HashMap, и свой собственный тип создавать не надо. В HashMap, например можно добыть данные по ключу, получать список ключей и много ещё чего полезного там есть.
А как этим хэшмапом пользоваться? На Джавапортал.ру информации не нашёл.

Сравнивать так: if (a[j].Кey < a[jmin].Кey) нельзя, потому что Key у тебя String, а не число. И вообще кey у тебя с маленькой буквы, а в Java в отличие от Паскаля идентификаторы чувствительны к регистру. key и Key - разные вещи.
Дурная привычка ^ ^
А как тогда строки сравнивать? О.о (допустим, передо мной стоит задача сравнить две переменные типа String).

Для сортировки в принципе не требуется писать специальных методов, в Java есть встроенные механизмы. Например, вот - http://www.javaportal.ru/java/articles/sort.html
Изобретать свой велосипед куда полезнее, познавательнее и интересней :)

P.S.> А на C# алгоритм сортировки сильно отличаться будет?
Чем там заменятся записи и классы?
Хотелось бы пару умных ссылок, где можно было бы про это коротко и внятно прочитать.. а то время поджимает >_<"

Cornknight
01-10-2009, 07:34
А как этим хэшмапом пользоваться? На Джавапортал.ру информации не нашёл. »

RTFM. То есть читай javadoc. Скачать можно отсюда: http://java.sun.com/javase/downloads/index.jsp

А как тогда строки сравнивать? О.о (допустим, передо мной стоит задача сравнить две переменные типа String). »

Если у тебя в String находятся числа, то их надо преобразовать в числа, а потом сравнивать. Преобразовать в число можно, например, так: Integer.parseInt(Key), ну или Double.parseDouble(Key), в зависимости от типа, который у тебя находится в Key. А вообще, если нет специальной причины делать Key строкой, то почему бы его сразу не объявить числом?

Если что-то другое, то.. не знаю. Как "Вася" сравнить с "Петя"? Тут разный подход возможен.. :) Можно сравнивать в алфавитном порядке так: a[j].Key.compareTo(a[jmin].Кey), но подробно про этот метод снова стоит почитать в документации.

Изобретать свой велосипед куда полезнее, познавательнее и интересней »

Кому как.. По мне лучше написать что-то действительно полезное. :)

А на C# алгоритм сортировки сильно отличаться будет?
Чем там заменятся записи и классы? »

На С# всё будет выглядеть почти так же. C# вообще местами от Java не отличить. :)

Хотелось бы пару умных ссылок, где можно было бы про это коротко и внятно прочитать.. а то время поджимает »

Ну, не знаю.. Гугль тебе в помощь. :)

ManHack
01-10-2009, 19:55
А как быть с сортировкой двоичным деревом? Там ведь указатели вида t^.key .... На что их заменить в C#?

К сожалению, ключи у меня содержат буквы и цифры :(

Cornknight
01-10-2009, 21:00
А как быть с сортировкой двоичным деревом? Там ведь указатели вида t^.key .... На что их заменить в C#? »

Ну не знаю я, что за сортировку ты имеешь в виду. Могу только сказать, что указателей ни в C#, ни в Java в явном виде нет.

К сожалению, ключи у меня содержат буквы и цифры »

Хорошо, тогда как ты их сравниваешь? Как определяешь какой больше, а какой меньше?

ManHack
01-10-2009, 21:38
Обычное лексикографическое упорядочивание по алфавиту вида:
Andrey
Kolya1
Kolya22
Laurinas
Vasyapupkin
Warezov
...

Судя повсему метод String.Compare(str1, str2, false) в C# и str1.compareTo(str2) в Java мне подходит...
Я переписал процедуры с использованием этого метода.
http://msdn.microsoft.com/ru-ru/library/885e1sy1.aspx (C#)

Теперь надо ломать голову над TreeSort...
оказывается это чудо в википедии всё-таки описано... http://ru.wikipedia.org/wiki/Сортировка_с_помощью_двоичного_дерева
осталось ээ... вдуматься в код ^_^

ManHack
01-10-2009, 21:55
Я не совсем понял что мы тут делаем:
public Tree(int k) { // конструктор с инициализацией ключа
key = k;
}

(взята из кода программы на Java по ссылке на Википедию выше)




© OSzone.net 2001-2012