• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Java] Jak zmienić wartość zmiennej przekazanej jako parametr metody?

Object Storage Arubacloud
0 głosów
2,253 wizyt
pytanie zadane 19 października 2015 w Java przez iwan9449 Pasjonat (20,810 p.)

Witam, mam takie pytanie. W jaki sposób zmienić w metodzie wartość zmiennej przekazanej do tej metody. W cpp można w tym celu użyć wskaźnika lub referencji, natomiast w javie typy proste są zawsze przekazywane przez wartośc, a obiekty jako kopie referencji. Jednak przesłanie do metody jako parametr obiektu klasy Integer nie rozwiązuje problemu. Oczywiście mżna bawić się w tworzenie własnej klasy z odpowiednimi getterami oraz setterami i w ten sposób zmieniać wartość parametru, bądź tworzyć jednoelementowe tablice, ale moim zdaniem jest to straszne kombinowanie. Nie ma jakiejś prostej metody, żeby zmienić wartość zmiennej int, bądź obiektu klasy Integerprzekazanych jako parametr funkcji? Poniżej podaj mój kod:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;

public class ReverseTable {
    public static void main(String args[]) throws FileNotFoundException {

        File input = new File("in.txt");
        Scanner file = new Scanner(input);
        ArrayList<Integer> table = new ArrayList<>();
        while(file.hasNextInt()) {
            table.add(file.nextInt());
        }
        Integer tab[] = table.toArray(new Integer[table.size()]);

        System.out.print("Oryginalna tablica: ");
        for(int i : tab) {
            System.out.print(i + ", ");
        }

        System.out.println();
        System.out.println();
        System.out.print("Odwrocenie iteracyjne: ");
        Integer countIteration = 0;
        Integer iteRevTab[] = iterationReverse(tab.clone(), countIteration);
        for(int i : iteRevTab) {
            System.out.print(i + ", ");
        }
        System.out.println("Ilosc operacji elementarych: " + countIteration);
}

public static Integer[] iterationReverse(Integer tab[], Integer counter) {
        int lastElement = tab.length - 1;
        int buffor;
        for(int firstElement = 0; firstElement < (tab.length - 1) / 2; firstElement++) {
            buffor = tab[firstElement];
            tab[firstElement] = tab[lastElement];
            tab[lastElement] = buffor;
            counter++;
            lastElement--;
        }
        return tab;
    }

Pozdrawiam!

1 odpowiedź

+1 głos
odpowiedź 19 października 2015 przez Javowiec Pasjonat (21,560 p.)
edycja 19 października 2015 przez Javowiec
public class ReverseTable {
	public static Integer counter;
	
    public static void main(String args[]) throws FileNotFoundException {
 
        File input = new File("in.txt");
        Scanner file = new Scanner(input);
        ArrayList<Integer> table = new ArrayList<>();
        while(file.hasNextInt()) {
            table.add(file.nextInt());
        }
        Integer tab[] = table.toArray(new Integer[table.size()]);
 
        System.out.print("Oryginalna tablica: ");
        for(int i : tab) {
            System.out.print(i + ", ");
        }
 
        System.out.println();
        System.out.println();
        System.out.print("Odwrocenie iteracyjne: ");
        Integer iteRevTab[] = iterationReverse(tab.clone());
        for(int i : iteRevTab) {
            System.out.print(i + ", ");
        }
        System.out.println("Ilosc operacji elementarych: " + counter);
    }
 
    public static Integer[] iterationReverse(Integer tab[]) {
        int lastElement = tab.length - 1;
        int buffor;
        int operationCounter = 0;
        for(int firstElement = 0; firstElement < (tab.length - 1) / 2; firstElement++) {
            buffor = tab[firstElement];
            tab[firstElement] = tab[lastElement];
            tab[lastElement] = buffor;
            lastElement--;
            operationCounter++;
        }
        counter = new Integer(operationCounter);
        return tab;
    }
}

Integer to tzw. klasa immutable, czyli niezmienialna (podobnie jak String - nie posiadają metod set, czyli setterów lub jak to woli - mutatorów). Nie możesz zmienić jej wartości, gdy już raz została utworzona.

Rozwiązaniem w tym przypadku jest skorzystanie z pola statycznego counter, ponieważ gdzieś musisz przechować pożądaną wartość Integer. W metodzie iterationReverse(...) dodałem zmienną int operationCounter, która zlicza liczbę operacji i po wszystkim inicjalizuję zmienną statyczną wartością zmiennej operationCounter. Potem wystarczy wyświetlić wartość zmiennej statycznej counter.

komentarz 19 października 2015 przez iwan9449 Pasjonat (20,810 p.)
Ok, tu wszystko działa fajnie, a co jeżeli chciałbym stworzyć tą samą funkcję, ale rekurencyjnie? wtedy za każdym wywołaniem rekurencji zmienna operationCounter będzie zerowana. Wiesz jak rozwiązać ten problem?
komentarz 19 października 2015 przez Javowiec Pasjonat (21,560 p.)
edycja 19 października 2015 przez Javowiec

Użyj tablicy zamiast Integera w metodzie iterationReverse(...):

public class ReverseTable {
    public static void main(String args[]) throws FileNotFoundException {
 
        File input = new File("in.txt");
        Scanner file = new Scanner(input);
        ArrayList<Integer> table = new ArrayList<>();
        while(file.hasNextInt()) {
            table.add(file.nextInt());
        }
        Integer tab[] = table.toArray(new Integer[table.size()]);
 
        System.out.print("Oryginalna tablica: ");
        for(int i : tab) {
            System.out.print(i + ", ");
        }
 
        System.out.println();
        System.out.println();
        System.out.print("Odwrocenie iteracyjne: ");
        Integer[] counterTable = new Integer[1];
        Integer iteRevTab[] = iterationReverse(tab.clone(), counterTable);
        for(int i : iteRevTab) {
            System.out.print(i + ", ");
        }
        System.out.println("Ilosc operacji elementarych: " + counterTable[0]);
    }
 
    public static Integer[] iterationReverse(Integer tab[], Integer[] counterTable) {
        int lastElement = tab.length - 1;
        int buffor;
        int operationCounter = 0;
        for(int firstElement = 0; firstElement < (tab.length - 1) / 2; firstElement++) {
            buffor = tab[firstElement];
            tab[firstElement] = tab[lastElement];
            tab[lastElement] = buffor;
            lastElement--;
            operationCounter++;
        }
        counterTable[0] = new Integer(operationCounter);
        return tab;
    }
}

Ostatecznym wyjściem jest stworzenie własnej, zmienialnej klasy.

komentarz 19 października 2015 przez iwan9449 Pasjonat (20,810 p.)
No właśnie i to są te dwie opcje, których chciałem uniknąć :D Troszkę mnie to denerwuje, że Java ma niby ułatwiać życie (w odniesieniu do cpp), a moim zdaniem w wielu miejscach je utrudnia ;) Mimo wszystko dzięki za pomoc :)

Podobne pytania

–1 głos
0 odpowiedzi 304 wizyt
pytanie zadane 16 lipca 2020 w Java przez T100 Obywatel (1,450 p.)
0 głosów
1 odpowiedź 1,249 wizyt
pytanie zadane 26 marca 2017 w Java przez BartekDataIT Użytkownik (770 p.)
+1 głos
2 odpowiedzi 1,646 wizyt
pytanie zadane 29 czerwca 2018 w Java przez niezalogowany

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...