Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Lefti

Jak przełożyć C++ na Java

Rekomendowane odpowiedzi

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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)]:

-s - 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://stackoverflow.com/questions/16458564/convert-character-to-ascii-numeric-value-in-java

 

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawa rozwiązana. Dziękuję bardzo :D

Do rozwiązania potrzebny był poprawny zapis "tablicy wektorowej":

List<Integer> tab[] = new List[255];

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...