Klasy i tablice - odczytywanie tablicy z klasy

0

Witam!

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

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
 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.

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.

//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();
}
0

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

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); */
	}
}


0

Po co Ci taka dziwna konstrukcja?

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);
    }
}
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?

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ą?

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?

0

Witam,

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

		     // 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);

0

Problem, goni problem:
Takie zapytanie:

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?

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1