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())?

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.

0

czyli w jaki sposob moge to rozwiazac?

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?

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

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

0

jak uzywam dwoch:

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)

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.

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.

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"

0

addSeries(null, double [] [] data)

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

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;
      }
 
0

data w obu wierszach musi mieć taki sam rozmiar

 
    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.

0

moze ja wkleje caly kod:

/*
 * 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

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

0

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

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

1
 
    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

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