Forum PCLab.pl: Jak przełożyć C++ na Java - Forum PCLab.pl

Skocz do zawartości

Otwarty

Ikona Ostatnio dodane tematy

Ikona Najnowsze pliki

Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

Jak przełożyć C++ na Java Jak przełożyć C++ na Java Oceń temat: -----

#1 Użytkownik jest niedostępny   Lefti 

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 2
  • Dołączył: Nd, 15 Kwi 18

Napisany 15 Kwiecień 2018 - 09:34

Witam.

Chciałbym przełożyć jeden z programów z C++ na Javę. Napotkałem pewną trudność która zapewne jest oczywista, ale jestem mało doświadczony.... :(

Program jest jedną z implementacji rozwiązania zadania "Litery" z XIX olimpiady informatycznej:

https://oi.edu.pl/l/19oi_ksiazeczka/

Oto kod interesującej mnie implementacji:

#include <cstdio>
#include <vector>
using namespace std;
 
/* Implementacja drzew przedzialowych wg strony:
 * http://was.zaa.mimuw.edu.pl/?q=node/9
 */
#define SIZE 20
int w[1 << (SIZE+1)];
 
void insert(int x, int val) {
   int v = (1 << SIZE) + x;
   w[v] = val;
   while (v != 1){
     v /= 2;
     w[v] = w[2 * v] + w[2 * v + 1];
   }
}
 
int query(int a, int b){
   int va = (1 << SIZE) + a;
   int vb = (1 << SIZE) + b;
    
   int wyn = w[va];
   if (va != vb) 
     wyn += w[vb];
 
   while (va / 2 != vb / 2) {
     if (va % 2 == 0) wyn += w[va + 1]; 
     if (vb % 2 == 1) wyn += w[vb - 1]; 
     va /= 2; vb /= 2;
   }
   return wyn;
}
 
#define MAXN 1000005
long long wynik;
int n, pos, temp;
vector<int> tab[255];
char s[MAXN];
 
int main(){
  temp = scanf("%d", &n);
  temp = scanf("%s", s);
  for (int i = n - 1; i >= 0; --i)
    tab[int(s[i])].push_back(i);
  temp = scanf("%s", s);
 
  for (int i = 0; i < n; ++i){
    pos = tab[int(s[i])].back();
    tab[int(s[i])].pop_back();
    insert(pos, 1);
    pos += query(pos+1, MAXN);
    wynik += pos - i;
  }
 
  temp = printf("%lld\n", wynik);
 
  return 0;
}

Tym czego nie rozumiem jest zapis znajdujący się w operacjach na vektorze. M.in:


tab[int(s[i])].push_back(i);
//oraz
pos = tab[int(s[i])].back();
//oraz
tab[int(s[i])].pop_back();

Nie mogę rozgryźć jak można takowy zapis przełożyć na Javę, nie chodzi mi o push_back, back czy pop_back, to rozwiązałem, lecz nie wiem jak przełożyć znajdujący się przed nimi zapis:
tab[int(s[i])]

Próbowałem Vector Javovy, ArrayList... lecz utknąłem.

Z góry dziękuję za pomoc :)

#2 Użytkownik jest niedostępny   traktor 

  • Orator
  • PipPipPipPip
  • Grupa: Forumowicze
  • Postów: 633
  • Dołączył: Wed, 18 Cze 08

Napisany 15 Kwiecień 2018 - 10:06

Nie wnikałem za bardzo w kod. Z tego co zrozumiałem to próbujesz się odwołać do konkretnego indexu w jakiejś kolekcji i go zmienić.
Tutaj możesz znaleźć inforamcje, że tego się w javie nie da zrobić. A przynajmniej nie w ładny sposób. Ew. możesz - tak jak napisali w tym wątku - samodzielnie zrobić swoją kolekcję która będzie umożliwiała takie operacje.

#3 Użytkownik jest niedostępny   Bono[UG] 

  • Wiecznie niewyspany...
  • PipPipPipPipPip
  • Grupa: Forumowicze
  • Postów: 18897
  • Dołączył: Pt, 27 Wrz 02

Napisany 15 Kwiecień 2018 - 10:33

tab jest tablicą wektorów. tab[jakaś_liczba] to odwołanie się do wektora na jakaś_liczba pozycji tablicy tab.
int(x) to rzutowanie iksa na liczbę całkowitą (nie jestem oswojony z taką formą rzutowania, imo jest tutaj zbędne, bo char w c/c++ to też liczba całkowita i spokojnie powinna się automatycznie skonwertować).

tab[int(s[i])]:
-s[i] - wyciągnięcie znaku na i-tej pozycji tablicy s
-następnie znak jest rzutowany na int-a
-wyciągniecie wektora na obliczonej wyżej pozycji

Nie pamiętam jak java pozwala na potraktowanie znaku jako wartości liczbowej i czy da się to zrobić w tak bezpośredni sposób jak w C (ostatni raz to z 10 lat temu coś pisałem).
Chyba się da: https://stackoverflo...c-value-in-java

Jak zrobić podobną strukturę do tablicy wektorów, to już odpadam.

#4 Użytkownik jest niedostępny   Lefti 

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 2
  • Dołączył: Nd, 15 Kwi 18

Napisany 15 Kwiecień 2018 - 11:47

Sprawa rozwiązana. Dziękuję bardzo :D
Do rozwiązania potrzebny był poprawny zapis "tablicy wektorowej":
List<Integer> tab[] = new List[255];


Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

1 Użytkowników czyta ten temat
0 użytkowników, 1 gości, 0 anonimowych