Klasy i tablice - odczytywanie tablicy z klasy

Klasy i tablice - odczytywanie tablicy z klasy
HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

Witam!

Nie do końca rozumiem projektowanie obiektowe, proszę o pomoc w interpretacji kodu:

Kopiuj
public class ObjectTest
{
	public class teamData{
		String teamName="";
		int numWins=0;
		int numLosses=0;
	}

	private teamData[] data;
	
	public void setTeamNames()
	{
		String[] stringTeams = {"Arizona Cardinals", "Atlanta Falcons", "Baltimore Ravens",
			 "Buffalo Bills", "Carolina Panthers", "Chicago Bears", "Cincinnatti Bengals", 
			 "Cleveland Browns", "Dallas Cowboys", "Denver Broncos", "Detroit Lions", 
			 "Green Bay Packers", "Houston Texans", "Indianapolis Colts",  "Jacksonville Jaguars", 
			 "Kansas City Chiefs", "Miami Dolphins", "Minnesota Vikings", "New England Patriots", 
			 "New Orleans Saints", "New York Giants", "New York Jets", "Oakland Raiders", 
			 "Philadelphia Eagles", "Pittsburgh Steelers", "San Diego Chargers", 
			 "San Francisco 49ers", "Seattle Seahawks", "St. Louis Rams", "Tampa Bay Buccaneers", 
			 "Tennessee Titans", "Washington Redskins"};
		
		//initialize teamData array 
		 data = new teamData[stringTeams.length];
		
		for(int i=0; i<data.length; i++)
		{
			teamData team = new teamData();
			team.teamName = stringTeams[i];
			data[i] = team;
		}
	}

	public teamData[] getTeams()
	{
		return data;
	}

	public static void main(String[] args) 
	{
		ObjectTest test = new ObjectTest();
		test.setTeamNames();
		
		teamData[] teams = test.getTeams();
		
		if(teams != null)
		{
			for(teamData team : teams)
			{
				System.out.println(team.teamName);
			}
		}
		
	}
}

Chcę napisać klasę której zadaniem będzie odczytać zawartość tabeli z bazy danych i utworzyć z nich tablicę. A następnie będę mógł odczytać sobie te dane w dowolnej chwili - dane to jednowymiarowa tabela stringów.
Znalazłem w sieci kod który realizuje mój pomysł, ale do końca nie wiem jak on działa, dlatego mam dwa pytania:

  1. Po co jest pętla for, rozumiem że wypełnia tablicę data imionami z tablicy stringTeams, ale czy jest to koniczne? Nie można normalnie odczytać stringTeams?
  2. Co robi zwrot: private teamData[] data;
0
Kopiuj
 for(int i=0; i<data.length; i++)
                {
                        teamData team = new teamData();
                        team.teamName = stringTeams[i];
                        data[i] = team;
                }

odp 1: pętla najpierw tworzy obiekt klasy teamData, później pole teamName utworzonego obiektu (czyli zmiennej teamName - spojrz na klase teamData - wzorzec dla obiektu) przypisuje wartość - czyli w tym wypadku nazwę z tablicy stringTeams, następnie do tablicy obiektów data (klasy teamData) przypisuje utworzony obiekt.
Odpowiedź na drugie pytanie: On tworzy tablicę obiektów klasy teamData.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

private teamData[] data; niczego nie tworzy. To jest deklaracja tablicy o nazwie data, każdy element tej tablicy będzie mógł przechować obiekt typu teamData.

Kopiuj
//utworzenie tablicy
int n=...;
data=new teamData[n];
//utworzenie obiektów i umieszczenie ich w tablicy
for(int i=0;i<data.length();i++)
{
    data[i]=new teamData();
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

Dzięki za pomoc. Analizowałem trochę ten kod, napisałem trochę inny i w kodzie zawarłem pytanie.

Kopiuj
public class Test {
	
	public class JakisPunkt{
			int x;
			int y;
	}
		
		static void zmien(JakisPunkt pkt){
		pkt.x++;
		pkt.y++;
	} 
}


--------------------------------------------

public class Main{

	public static void main(String args[]){
		JakisPunkt punkt = new JakisPunkt(); //W jaki sposób mogę utworzyć obiekt z tej podklasy? Czy w ogóle mogę go utworzyć?
		punkt.x = 5;
		punkt.y = 5;

		Test.zmien(punkt);

		System.out.println("Współrzędne to: "+punkt.x+" "+punkt.y); */
	}
}


bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Po co Ci taka dziwna konstrukcja?

Kopiuj
public class Test 
{ 
    public class JakisPunkt
    {
        int x;
        int y;
    }
 
    static void zmien(JakisPunkt pkt)
    {
        pkt.x++;
        pkt.y++;
    }
    public JakisPunkt foo()
    {
        return new JakisPunkt();
    }        
}

public class Main{
 
    public static void main(String args[])
    {
        Test t=new Test();
        Test.JakisPunkt punkt=t.foo();
        punkt.x = 5;
        punkt.y = 5;
 
        Test.zmien(punkt);
        System.out.println("Współrzędne to: "+punkt.x+" "+punkt.y);
    }
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

Dziwna konstrukcja? Czego konkretnie nie należy stosować? Kod jest napisany na bazie kodu z internetu (ten na górze strony). Użyłeś dodatkowej metody, bez niej rozumiem że nie ma dostępu do tej klasy?

iooi
Jest, poprzez t.new JakisPunkt()
0

Dla mnie dziwne jest to, że w jednej klasie (Main) chcesz tworzyć obiekty klasy wewnętrznej innej klasy (JakisPunkt w Test). Dlaczego JakisPunkt nie jest samodzielna klasą?

HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

To by trzeba było zapytać tamtego gościa ;). Ja sobie przeredagowałem jego kod. On napisał wszystko w jednym "pliku", chciałem wyrzucić niepotrzebny kod do drugiego - ale wtedy jest właśnie problem z klasą w klasie. Sugerujecie, ze bardziej poprawnie jest tworzyć osobne "pliki" z klasami, nawet dla krótkich kodów? Nie stosować klas w klasie?

HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

Witam,

Mam problem z wynikiem z bazy danych, napisałem kod który poda mi ilość rekordów, kod:

Kopiuj
		     // String zapytanie = new String(sql);
		      
		      Statement sta = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
		      ResultSet res = sta.executeQuery(sql);
		      
		     res.last();		      
		      
		     int iloscWierszy = res.getRow();
		     
		     int L = iloscWierszy; // Wynik daje 3
		     System.out.println("Ostatni: " +L);
		       		      
		  String[] imie = new String[10]; 
	    	  String[] adres = new String[10];		      
	    	  String[] miasto = new String[10];
	    	  
	    	  res.first();
	    	  
	    	  int L2 = res.getRow(); // Wynik daje 1
	    	  System.out.println("Pierwszy: " +L2);
	    	  
		      while (res.next()) {	 // Wyswietla jedynie dwa rekordy	    	  
		    	  
		    	  
		    	  //int rowCount = res.getRow();
		    	  
		    	  imie[res.getRow()] = res.getString("adr_Name");
		    	  adres[res.getRow()] = res.getString("adr_Address1");
		    	  miasto[res.getRow()] = res.getString("adr_City");
		    	  //String lastName = res.getString("adr_Name");
			      System.out.println("First customer: " +imie[res.getRow()]+ "\t" +adres[res.getRow()]+ "\t" +miasto[res.getRow()]);
			      
			     int rowCount = res.getRow();
			     System.out.println("Number of Rows=" + rowCount);
		      } 

Gdy usuną res.last(); i res.first(); zapytanie wyświetla poprawnie 3 rekordy, natomiast gdy dodam zliczanie nie pokazuje pierwszego rekordu. Dlaczego (res.getRow(); - daje liczbę 1) ?

Ok, rozwiązałem problem zastępując res.first(); res.absolute(0);

edytowany 2x, ostatnio: hansikkk
HA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:40
0

Problem, goni problem:
Takie zapytanie:

Kopiuj
sql = "SELECT pc__Package.pc_Charge, adr__Address.adr_Name, adr__Address.adr_Address1, adr__Address.adr_Address2, pc__Package.pc_DelivererId," +
		      "adr__Address.adr_ZipCode, adr__Address.adr_City, adr__Address.adr_PhoneNumber, adr__Address.adr_Company, pc__Package.pc_Weight," +
		      "pc__Package.pc_SendingDate, cs_CustEmail.ce_email, pc__Package.pc_DeliveryId, cs_CustEmail.ce_default FROM adr__Address INNER JOIN" +
		      "pc__Package ON adr__Address.adr_PackageId = pc__Package.pc_Id INNER JOIN cs_CustEmail ON pc__Package.pc_CustomerId = cs_CustEmail.ce_CustomerId" +
		      "WHERE (ISNULL(pc__Package.pc_SendingDate, 0) = 0) AND (cs_CustEmail.ce_default = 1)";

W MS SQL Server Studio - działa idealnie, w Javie wyskakuje błąd:
Exception: Incorrect syntax near the keyword 'ON'.

WTF?

VG
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 8 lat
  • Postów:79
0

Czy przypadkiem
[code]"pc__Package.pc_SendingDate, cs_CustEmail.ce_email, pc__Package.pc_DeliveryId, cs_CustEmail.ce_default FROM adr__Address INNER JOIN" +
"pc__Package ON adr__Address.adr_PackageId = pc__Package.pc_Id INNER JOIN cs_CustEmail ON pc__Package.pc_CustomerId = cs_CustEmail.ce_CustomerId"[/code]
Nie spowoduje, że zapytanie będzie wyglądać tak:
[code][..]FROM adr__Address INNER JOINpc__Package ON adr__Address.adr_PackageId[..][/code]

Zwróć uwagę na brak spacji po INNER JOIN. Kolejne złączenie też spowoduje taki błąd, więc popraw we wszystkich


edytowany 1x, ostatnio: VGT

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.