116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
package com.example.programpengurutanangka
 | 
						|
 | 
						|
import android.os.Bundle
 | 
						|
import androidx.activity.ComponentActivity
 | 
						|
import androidx.activity.compose.setContent
 | 
						|
import androidx.activity.enableEdgeToEdge
 | 
						|
import androidx.compose.foundation.layout.*
 | 
						|
import androidx.compose.material3.*
 | 
						|
import androidx.compose.runtime.*
 | 
						|
import androidx.compose.ui.Alignment
 | 
						|
import androidx.compose.ui.Modifier
 | 
						|
import androidx.compose.foundation.text.KeyboardOptions
 | 
						|
import androidx.compose.ui.text.input.KeyboardType
 | 
						|
import androidx.compose.ui.tooling.preview.Preview
 | 
						|
import androidx.compose.ui.unit.dp
 | 
						|
import com.example.programpengurutanangka.ui.theme.ProgramPengurutanAngkaTheme
 | 
						|
 | 
						|
class MainActivity : ComponentActivity() {
 | 
						|
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
						|
        super.onCreate(savedInstanceState)
 | 
						|
        enableEdgeToEdge()
 | 
						|
        setContent {
 | 
						|
            ProgramPengurutanAngkaTheme {
 | 
						|
                Scaffold { innerPadding ->
 | 
						|
                    ProgramPengurutanAngka(
 | 
						|
                        modifier = Modifier
 | 
						|
                            .padding(innerPadding)
 | 
						|
                            .padding(16.dp)
 | 
						|
                    )
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
@Composable
 | 
						|
fun ProgramPengurutanAngka(modifier: Modifier = Modifier) {
 | 
						|
    var input by remember { mutableStateOf("") }
 | 
						|
    var result by remember { mutableStateOf("") }
 | 
						|
    var error by remember { mutableStateOf<String?>(null) }
 | 
						|
    var ascending by remember { mutableStateOf(true) }
 | 
						|
 | 
						|
    Column(
 | 
						|
        modifier = modifier.fillMaxSize(),
 | 
						|
        verticalArrangement = Arrangement.Top,
 | 
						|
        horizontalAlignment = Alignment.Start
 | 
						|
    ) {
 | 
						|
        OutlinedTextField(
 | 
						|
            value = input,
 | 
						|
            onValueChange = {
 | 
						|
                input = it
 | 
						|
                error = null
 | 
						|
            },
 | 
						|
            label = { Text("Masukkan angka (contoh: 9, 5, 1 atau 9 5 1 atau 9;5;1)") },
 | 
						|
            modifier = Modifier.fillMaxWidth(),
 | 
						|
            keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text)
 | 
						|
        )
 | 
						|
 | 
						|
        Spacer(modifier = Modifier.height(8.dp))
 | 
						|
 | 
						|
        Row(verticalAlignment = Alignment.CenterVertically) {
 | 
						|
            Text("Urutkan:")
 | 
						|
            Spacer(modifier = Modifier.width(8.dp))
 | 
						|
            RadioButton(selected = ascending, onClick = { ascending = true })
 | 
						|
            Text("Ascending", modifier = Modifier.padding(end = 12.dp))
 | 
						|
            RadioButton(selected = !ascending, onClick = { ascending = false })
 | 
						|
            Text("Descending")
 | 
						|
        }
 | 
						|
 | 
						|
        Spacer(modifier = Modifier.height(12.dp))
 | 
						|
 | 
						|
        Button(onClick = {
 | 
						|
            // Ambil semua angka yang valid (mendukung sign dan desimal, koma/dot sebagai pemisah desimal)
 | 
						|
            val regex = Regex("-?\\d+[\\.,]?\\d*")
 | 
						|
            val parsed = regex.findAll(input)
 | 
						|
                .map { it.value.replace(',', '.') }   // ubah koma jadi dot supaya parseDouble berhasil
 | 
						|
                .mapNotNull { it.toDoubleOrNull() }
 | 
						|
                .toList()
 | 
						|
 | 
						|
            if (parsed.isEmpty()) {
 | 
						|
                error = "Tidak ditemukan angka valid. Gunakan pemisah koma/spasi/semicolon atau masukkan angka."
 | 
						|
                result = ""
 | 
						|
            } else {
 | 
						|
                val sorted = if (ascending) parsed.sorted() else parsed.sortedDescending()
 | 
						|
                result = sorted.joinToString(", ") { n ->
 | 
						|
                    // tampilkan tanpa .0 jika integer
 | 
						|
                    if (n % 1.0 == 0.0) n.toLong().toString() else n.toString()
 | 
						|
                }
 | 
						|
                error = null
 | 
						|
            }
 | 
						|
        }) {
 | 
						|
            Text("Urutkan")
 | 
						|
        }
 | 
						|
 | 
						|
        Spacer(modifier = Modifier.height(12.dp))
 | 
						|
 | 
						|
        if (error != null) {
 | 
						|
            Text(text = error!!, color = MaterialTheme.colorScheme.error)
 | 
						|
        }
 | 
						|
 | 
						|
        Text(
 | 
						|
            text = "Hasil: $result",
 | 
						|
            style = MaterialTheme.typography.bodyLarge,
 | 
						|
            modifier = Modifier.padding(top = 8.dp)
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
@Preview(showBackground = true)
 | 
						|
@Composable
 | 
						|
fun PreviewProgram() {
 | 
						|
    ProgramPengurutanAngkaTheme {
 | 
						|
        ProgramPengurutanAngka()
 | 
						|
    }
 | 
						|
}
 |