Nierowna dlugosc list

Nierowna dlugosc list
0

Mam taki blad

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 3684, Size: 3684
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at rozniczkowanie.Wykres.createDataset(Wykres.java:81)
at rozniczkowanie.Rozniczkowanie.rozniczka(Rozniczkowanie.java:154)

Dlatego, ze chce do jednej tablicy wrzucic 2 listy, ktore maja rozna dlugosc. Znalazlem cos takiego jak subList(index, index), ale nie wiem za bardzo jak tego uzyc.

Lista_dluzsza.subList( ?, lista_krotsza.size())?

airborn
  • Rejestracja:prawie 16 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
0

Problemem nie jest wrzucanie czegoś do listy, tylko pobieranie z listy nieistniejącego elementu (widać w stack trace, że wyjątek rzuca metoda get). Tablica taka jak Twoja o 3684 elementach ma elementy o indeksach od 0 do 3683, czyli o jeden mniej niż Ty pobierasz.

Nie bardzo rozumiem co Ty z tymi listami próbujesz zrobić szczerze powiedziawszy.

edytowany 1x, ostatnio: airborn
0

czyli w jaki sposob moge to rozwiazac?

airborn
  • Rejestracja:prawie 16 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
0

Ale co chcesz rozwiązać?
Usunąć błąd?
Nie odwołuj się do indeksu spoza rozmiaru tablicy (pewnie gdzieś ustawiłeś wartość jakiegoś licznika o 1 za dużo)

Dodać do jednej listy dwie listy o różnych długościach?

Kopiuj
List<T> list = new ArrayList<>();
lista.addAll(longerList);
lista.addAll(shorterList);
0

chce wykorzystać do tego (wiem, ze pewnie tak sie nie pisze, ale nie wiem jak dodac listy do dataCreate

Kopiuj
   public static XYDataset createDataset(ArrayList <Double> lista1, ArrayList <Double> lista2) {

        DefaultXYDataset ds = new DefaultXYDataset();

        double[][] data = new double[2][]; 
        double[] daneX = new double[lista.size()];
		double[] daneY = new double[lista2.size()]; 
        
		for (int i = 0; i < lista.size(); ++i) {
			daneX[i] = (double) lista.get(i);
			daneY[i] = (double)lista2.get(i);
		}
		
		data[0] = daneX;
		data[1] = daneY;
		
        ds.addSeries("series1", data);

        return ds;
    }
edytowany 2x, ostatnio: bogdans
Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 8 lat
0

Wstaw kod. Indeksy są liczone od zera, więc jak chcesz uzyskać np. ostatni element listy to musisz zrobić lista.get(lista.length - 1). Strzelam, że masz tam jakąś pętle z warunkiem i <= lista.length.

Edit: Zły timing miałem :p Skoro listy są różnych długości to nie możesz używać jednego licznika w pętli. Użyj dwóch, chociaż można to zrobić oczywiście lepiej :)

edytowany 1x, ostatnio: Wizzie
0

jak uzywam dwoch:

Kopiuj
public static XYDataset createDataset(ArrayList <double> lista1, ArrayList <double> lista2) {

        DefaultXYDataset ds = new DefaultXYDataset();

        double[][] data = new double[2][]; 
        double[] daneX = new double[lista.size()];
        double[] daneY = new double[lista2.size()]; 
        
        for (int i = 0; i < lista.size(); ++i) {
            daneX[i] = (double) lista.get(i);
          
        }
        for (int i = 0; i < lista2.size(); ++i) {
           
            daneY[i] = (double)lista2.get(i);
        }
        
        data[0] = daneX;
        data[1] = daneY;
        
        ds.addSeries("series1", data);

        return ds;
    }

to mam blad:
ception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: The 'data' array must contain two arrays with equal length.
at org.jfree.data.xy.DefaultXYDataset.addSeries(DefaultXYDataset.java:272)

edytowany 1x, ostatnio: bogdans
MD
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:280
0

Rozumiem, że chcesz osiągnąć, żeby tablica data miała nie równe rozmiary. Dla przykładu jedna lista ma rozmiar 5 druga 10 to indeksy mają dla data[0] wynosić tutaj max 5 (ostatni element data[0][5]) dla data[1] max 10 (ostatni element data[1][10])...Tablica musi być kwadratowa.

edytowany 2x, ostatnio: MoorfoxD
0

No wlanie chyba musi byc kwardratowa bo nie wyrysuje wykresu, tylko ona sie rozni o jakies 50 indeksow i chyba musze jakos zrobic tak, zeby usuwalo te indeksy, ktorych jest nadmiar (?) tylko nie wiem jak mam to zrobic, bardzo prosze zeby ktos napisal kod, ktory musze gdzies wstawic.

L2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Rybnik
  • Postów:4
0

teraz masz błąd w linii
ds.addSeries("series1", data);
gdzie parametr data musi mieć dwie tablice o identycznych rozmiarach "The 'data' array must contain two arrays with equal length"
Podaj definicję parametrów funkcji "addSeries"

MD
0

addSeries(null, double [] [] data)

MD
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:280
0

Może powiedz lepiej co to ma robić, to ma być coś w stylu (napisałem z nudów, żeby coś napisać)
Na pewno są błędny pisane w notatniku ;d

Kopiuj
public class Punkt {
private double x;
private double y;

    void setX(double x)
    { this.x = x;}
    void setY(double y)
    {  this.y = y;}
}


     public Punkt[] funkcja(ArrayList <double> lista1, ArrayList <double> lista2)
      {
            int i = 0;
            Punkt[] punkty = new Punkt[lista.size()>lista2.size() ? lista2.size() : lista.size()];
            for(Punkt p : punkty)
            {
            p.setX(lista[i]);
            p.setY(lista2[i]);
            i++;
            }
          return punkty;
      }
 
edytowany 2x, ostatnio: MoorfoxD
L2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Rybnik
  • Postów:4
0

data w obu wierszach musi mieć taki sam rozmiar

Kopiuj
 
    addSeries

    public void addSeries(java.lang.Comparable seriesKey,
                          double[][] data)

    Adds a series or if a series with the same key already exists replaces the data for that series, then sends a DatasetChangeEvent to all registered listeners.

    Parameters:
        seriesKey - the series key (null not permitted).
        data - the data (must be an array with length 2, **containing two arrays of equal length,** the first containing the x-values and the second containing the y-values).

Moe podaj przykładowe dane które masz i czemu się różnią? Każdemu X pierwszego wiersza musi odpowiadać Y z drugiego.

edytowany 1x, ostatnio: bogdans
0

moze ja wkleje caly kod:

Kopiuj
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wykres;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.event.ChartChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

/**
 *
 * @author 
 */
public class Wykres 

{
      public static void rysuj() {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Charts");

                frame.setSize(600, 400);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);

                XYDataset ds = createDataset();
                JFreeChart chart = ChartFactory.createXYLineChart("Wykres",
                        "x", "y", ds, PlotOrientation.VERTICAL, true, true,
                        false);
                chart.addChangeListener((ChartChangeListener) chart);

                
                ChartPanel cp = new ChartPanel(chart);
              

                frame.getContentPane().add(cp);
            }

            private XYDataset createDataset() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });

    }

   public static XYDataset createDataset(ArrayList <Double> lista, ArrayList <Double> lista2) {

        DefaultXYDataset ds = new DefaultXYDataset();

        double[][] data = new double[2][]; 
        double[] daneX = new double[lista.size()];
		double[] daneY = new double[lista2.size()]; 
        
		for (int i = 0; i < lista.size(); ++i) {
			daneX[i] = (double) lista.get(i);
			
		}
                for (int i =0; i< lista2.size(); i++){
                    daneY[i] = (double)lista2.get(i);
                }
		
		data[0] = daneX;
		data[1] = daneY;
		
        ds.addSeries("series1", data);
       

        return ds;
    }


}


    

ma narysowac wykres i musi sie dac pozniej klikac na niego i odczytac X i Y, wiem ze mozna zrobic getX() i getY(), ale to odczytuje pozycje na calym panelu, a nie faktyczne wartosci z wykresu

edytowany 1x, ostatnio: bogdans
MD
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:280
0

Wykres to nic innego jak zbiór punktów, jest tyle samo X co Y. A twoje listy mają mieć różne długości ? Jeżeli tak podałem ci chyba dobry kod, który stworzy tablicę Punktów i będzie tyle X i Y co wynosi rozmiar krótszej listy... po tym przepisze wartości X i Y do tablicy punktów

edytowany 2x, ostatnio: MoorfoxD
0

p.setX(lista.get(i)); //object connot converte to double

MD
Porobiłem tam błędy zmień argument z lista1 na lista no i ArrayList<Double> i powinno być dobrze
0

i w jaki sposob mam te punkty polaczyc z createdataBase? przepraszam, ze tak mecze ale nie jestem programista i idzie mi to strasznie opornie

MD
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:280
1
Kopiuj
 
    public Punkt[] funkcja(ArrayList<Double> lista, ArrayList <Double> lista2)
    {
        Punkt[] punkty = new Punkt[lista.size()>lista2.size() ? lista2.size() : lista.size()];
        for(int i = 0;i<punkty.length;i++)
        {
            punkty[i] = new Punkt();
            punkty[i].setX(lista.get(i));
            punkty[i].setY(lista2.get(i));
        }
        return punkty;
    }

Masz poprawione działające.

0

Dzięki wielkie za pomoc!

0

Niestety, ale klasa punkt jest "Punkt []", a ja potrzebuje stworzyc data [][], jednowymiarowa nieprzejdzie

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.