Я новичок в java, может ли кто-нибудь помочь мне в этом. У меня есть таблица db (образец) с одним столбцом (имя), я хочу читать записи из этой таблицы и хранить их в массиве (я не хочу собирать вещи для коллекций). Я хочу, чтобы размер массива увеличивался динамически. Может ли кто-нибудь исправить мой код. Я размещаю свой код здесь. Спасибо.
public class ArrayEx {
public static void main(String[] args) throws Exception {
String str[]=new String[4];
int i=-1;
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","sasi","admin");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select name from sample");
while(rs.next()){
i++;
str[i]=rs.getString("name");
}
for(int j=0;j<str.length;j++)
{
System.out.print(str[j]+" ");
}
}
}
Если вам нужен массив, который растет, используйте ArrayList. В противном случае вы можете определить количество строк вверх и использовать массив.
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs=st.executeQuery("select name from sample");
rs.last();
int lastRow = rs.getRow();
String str[]=new String[lastRow-1];
rs.beforeFirst();
while (rs.next()) {
...
}
В принципе, если вы действительно хотите использовать "растущий" массив, он будет выглядеть так:
int capcity = 4;
int usedSlots = 0;
String growingArray[] = new String[capcity];
Теперь вы "просто" постоянно увеличиваете "usedSlots" каждый раз, когда вы храните значение в своем массиве. Если "usedSlots" достигает текущей "емкости"; вы можете увеличить емкость, создать новый массив, скопировать все существующие элементы массива... и так далее. Но, как указывали другие, нет необходимости расти в массиве, если заранее известно заранее определенное количество требуемых элементов. С другой стороны, если это число неизвестно, то использование массивов просто неверно.
Вы видите - если мы не говорим о занятиях для вашей домашней работы, ваше требование не использовать Коллекции - это хорошо... "глупо". Его, как просить плотника связать некоторые предметы с гвоздями; но, пожалуйста, без использования молотка.
Проще говоря: это не имеет смысла; вы ничего не получаете от использования Коллекций. Фактически, вы получаете код, который будет сложнее понять и поддерживать (и это может вызвать у вас довольно негативную обратную связь, когда вы представляете этот код в обзоре своим сверстникам).
Это не объектно ориентированное и выглядит как небольшое упражнение C
Во всяком случае, для вашего кода очень мало изменений: Примечание: Arrays.copyOf()
выделяет новый массив указанного размера и копирует элементы исходного. Возможно, вы тоже захотите сделать это вручную...
public static void main(String[] args) throws Exception {
int incSize = 4; // will increase the array of this size when needed
String str[]=new String[incSize];
int i=0; // keeps count of nb of occupied slots
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","sasi","admin");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select name from sample");
while(rs.next()){
// If we reach the end of the array, let increase it
if (i == str.length) {
str = Arrays.copyOf(str, str.length+incSize);
}
str[i] = rs.getString("name");
i++;
}
for(int j=0;j<str.length;j++)
{
System.out.print(str[j]+" ");
}
}
Использование Коллекций - лучший способ. Но, поскольку вы не хотите, чтобы вы использовали Collection, вы можете сделать что-то подобное.
В первом просто объявите массив как
String str [];
После того как вы выполнили запрос и получили набор результатов, вы можете динамически назначить значение для str, используя размер набора результатов.
ул = новый [ResultSet_size];
Но это очень старый и плохой метод кодирования.
ArrayList
.